2015-07-14 3 views
-1

Мне кажется простой задачей, но мне нужна помощь экспертов sql с этим.SQL Server Row to Cols

Table samples and requested result

Количество контактов может варьироваться от 1 до 30 человек, и я хочу, чтобы все телефонные номера в одной строке на cust_ref.

Как это сделать?

+0

Вам необходимо использовать динамический SQL для этого ;). –

+1

вы можете проверить http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server link –

+0

@ shA.t: Я разместил решение без динамического SQL. – Shnugo

ответ

1

Это решение без динамического 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   
+0

Спасибо, Шнуго, но я должен сделать это с помощью SQL-запроса. Я не могу использовать функции. Есть ли решение без UDF? – Aren

+0

Извините, не понимаю этого ... Опубликованное решение - чистый SQL, без UDF. Просто приспособите это к вашим потребностям/названиям таблиц ... И, пожалуйста, отметьте как принято и/или повысьте голос, если это полезно ... – Shnugo

+0

Ваше право после адаптации @contact для реального содержимого базы данных работает GREAT !! Спасибо, Шнуго! – Aren

0

с помощью 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