Мне кажется простой задачей, но мне нужна помощь экспертов sql с этим.SQL Server Row to Cols
Количество контактов может варьироваться от 1 до 30 человек, и я хочу, чтобы все телефонные номера в одной строке на cust_ref.
Как это сделать?
Мне кажется простой задачей, но мне нужна помощь экспертов sql с этим.SQL Server Row to Cols
Количество контактов может варьироваться от 1 до 30 человек, и я хочу, чтобы все телефонные номера в одной строке на cust_ref.
Как это сделать?
Это решение без динамического SQL, пожалуйста, попробуйте:
declare @contacts table(cust_ref int,phone varchar(100));
insert into @contacts values(10000,'ph10000a'),(10000,'ph10000b'),(10000,'ph10000c')
,(10001,'ph10001a'),(10001,'ph10001b'),(10001,'ph10001c')
,(10002,'ph10002a'),(10002,'ph10002b');
SELECT p.*
FROM
(
SELECT 'phone'+REPLACE(STR(ROW_NUMBER() OVER(PARTITION BY cust_ref ORDER BY phone),2),' ','0') AS inx,*
FROM @contacts
) AS tbl
PIVOT
(
MIN(phone) FOR inx IN(phone01,phone02,phone03,phone04) --type more...
) AS p
Спасибо, Шнуго, но я должен сделать это с помощью SQL-запроса. Я не могу использовать функции. Есть ли решение без UDF? – Aren
Извините, не понимаю этого ... Опубликованное решение - чистый SQL, без UDF. Просто приспособите это к вашим потребностям/названиям таблиц ... И, пожалуйста, отметьте как принято и/или повысьте голос, если это полезно ... – Shnugo
Ваше право после адаптации @contact для реального содержимого базы данных работает GREAT !! Спасибо, Шнуго! – Aren
с помощью CROSS ОТНОСИТЬСЯ, КТР и UNION ALL мы можем получить вышеуказанную требование
declare @tableA table (RefId int,Phone varchar(10))
insert into @tableA (RefId,Phone)values (10000,'03'),(100123,06)
Declare @tableB table (CustID INT,RefId INT,Phone varchar(10)))
insert into @tableB (CustID,RefId,Phone)values
(1,10000,'030245789'),
(2,10000,'030245889'),
(1,100123,'060245789'),
(2,100123,'060243389'),
(3,100123,'060289389')
; with CTE AS (
select A.RefId,A.Phone As Phone from @tableA A
UNION
select B.RefId,B.Phone As Phone from @tableB B)
select * from (
Select RefId,
val,
COL + CAST(ROW_NUMBER()OVER(PARTITION BY RefId ORDER BY RefId) AS VARCHAR(1))RN
FROM CTE
CROSS APPLY (VALUES ('Phone',Phone))CS(Col,val))T
PIVOT (MAX(VAL) FOR RN IN ([Phone1],[Phone2],[Phone3],[Phone4]))P
Вам необходимо использовать динамический SQL для этого ;). –
вы можете проверить http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server link –
@ shA.t: Я разместил решение без динамического SQL. – Shnugo