Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перемещение дашшых из столбца в столбец  [new]
ostoha
Member

Откуда:
Сообщений: 27
Платформа: Microsoft SQL Server 2008
Есть таблица:

NOwner Phone01 Phone02 Phone03 Phone04 Phone05
1 +7(3852)22-22-22 NULL +7(3852)22-22-23 NULL NULL
3 NULL NULL NULL +7(3852)22-22-24 +7(3852)22-22-25


Телефоны могут быть заполненны в любых полях или только в одном
Как получить перенеся данные в первые столбцы если они не пустые:
NOwner Phone01 Phone02 Phone03 Phone04 Phone05
1 +7(3852)22-22-22 +7(3852)22-22-23 NULL NULL NULL
3 +7(3852)22-22-24 +7(3852)22-22-25NULLNULLNULL
5 июл 13, 10:57    [14526100]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select Phone01 =COALESCE(Phone01,Phone02,Phone03,Phone04) .....
5 июл 13, 11:04    [14526148]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
+

Declare @t table (id int, ph1 VarChar(20), ph2 VarChar(20), ph3 VarChar(20), ph4 VarChar(20), ph5 VarChar(20))

insert into @t (id, ph1, ph2, ph3, ph4, ph5)
select 1,	 '+7(3852)22-22-22',	 NULL,	 '+7(3852)22-22-23',	 NULL,	 NULL
union all
select 3,	 NULL,	 NULL,	 NULL,	 '+7(3852)22-22-24',	 '+7(3852)22-22-25'

;with PH as
(
select ROW_NUMBER() over (partition by id order by IsNULL(ph1, '') DESC) as s, *
from 
(select id, ph1, 1 as phN
from @t
union all
select id, ph2, 2
from @t
union all
select id, ph3, 3
from @t
union all
select id, ph4, 4
from @t
union all
select id, ph5, 5
from @t) as a)

Select PH1.id, PH1.ph1 as PH1, PH2.ph1 as PH2, PH3.ph1 as PH3, PH4.ph1 as PH4, PH5.ph1 as PH5 
from PH as PH1 inner join PH as PH2 on PH1.id=PH2.id
inner join PH as PH3 on PH1.id=PH3.id
inner join PH as PH4 on PH1.id=PH4.id
inner join PH as PH5 on PH1.id=PH5.id
where PH1.s=1 and PH2.s=2 and PH3.s=3 and PH4.s=4 and PH5.s=5



У меня какая то такая бяка получилась
5 июл 13, 11:21    [14526299]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Коды, то Барнаулские, земляк поди еще
5 июл 13, 11:24    [14526322]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34620
ostoha,

Мужик, тут надо редизайн базы делать, нарушение 1 нормальной формы убирать.
А не update ами заниматься.
5 июл 13, 11:30    [14526383]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
DECLARE @T TABLE(NOwner INT,Phone01 VARCHAR(30),Phone02 VARCHAR(30),Phone03 VARCHAR(30),Phone04 VARCHAR(30),Phone05 VARCHAR(30));
INSERT @T(NOwner,Phone01,Phone02,Phone03,Phone04,Phone05)VALUES
(1,'+7(3852)22-22-22',NULL,'+7(3852)22-22-23',NULL,NULL)
,(3,NULL,NULL,NULL,'+7(3852)22-22-24','+7(3852)22-22-25');

SELECT NOwner,T.* FROM @T CROSS APPLY
(
SELECT Phone01=[1],Phone02=[2],Phone03=[3],Phone04=[4],Phone05=[5]
FROM
(
SELECT ROW_NUMBER()OVER(ORDER BY LEFT(V,0) DESC,V), V
FROM (VALUES(Phone01),(Phone02),(Phone03),(Phone04),(Phone05))P(V)
)T(N,V)
PIVOT(MIN(V) FOR N IN([1],[2],[3],[4],[5])) Pvt
) T;
5 июл 13, 11:38    [14526466]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Извините, тег не проставился
DECLARE @T TABLE(NOwner INT,Phone01 VARCHAR(30),Phone02 VARCHAR(30),Phone03 VARCHAR(30),Phone04 VARCHAR(30),Phone05 VARCHAR(30));
INSERT @T(NOwner,Phone01,Phone02,Phone03,Phone04,Phone05)VALUES
 (1,'+7(3852)22-22-22',NULL,'+7(3852)22-22-23',NULL,NULL)
,(3,NULL,NULL,NULL,'+7(3852)22-22-24','+7(3852)22-22-25');

SELECT NOwner,T.* FROM @T CROSS APPLY
(
 SELECT Phone01=[1],Phone02=[2],Phone03=[3],Phone04=[4],Phone05=[5]
 FROM
 (
  SELECT ROW_NUMBER()OVER(ORDER BY LEFT(V,0) DESC,V), V
  FROM (VALUES(Phone01),(Phone02),(Phone03),(Phone04),(Phone05))P(V)
 )T(N,V)
 PIVOT(MIN(V) FOR N IN([1],[2],[3],[4],[5])) Pvt
) T;
5 июл 13, 11:39    [14526471]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
в принципе то же самое:
declare @myTable table (NOwner INT,Phone01 VARCHAR(30),Phone02 VARCHAR(30),Phone03 VARCHAR(30),Phone04 VARCHAR(30),Phone05 VARCHAR(30))
insert @myTable values (1,'+7(3852)22-22-22',NULL,'+7(3852)22-22-23',NULL,NULL),(3,NULL,NULL,NULL,'+7(3852)22-22-24','+7(3852)22-22-25')

select * from (
   select 
      NOwner,
      'Phone0'+convert(varchar,ROW_NUMBER()over(partition by NOwner order by val))rn,
      val 
   from @myTable
   unpivot(val for txt in(Phone01,Phone02,Phone03,Phone04,Phone05))u
   )u
pivot(max(val)for rn in (Phone01,Phone02,Phone03,Phone04,Phone05))p
5 июл 13, 12:00    [14526668]     Ответить | Цитировать Сообщить модератору
 Re: Перемещение дашшых из столбца в столбец  [new]
ostoha
Member

Откуда:
Сообщений: 27
Спасибо большое всем за помошь!!!
6 июл 13, 04:48    [14530634]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить