2013-07-30 39 views
1

我一直在使用SQL一段時間,但我仍然是一個小菜鳥,所以我來這裏尋求幫助。 我在網站上搜索過,但沒有完全找到我期望完成的事情。將列數據轉換爲行並增加列名的SQL

我想用SQL取兩列是這樣的:

VisitNumber ID 
39332  759666 
39332  769445 
39332  775795 
40329  762595 
40329  769447 
40329  775796 
40329  783782 
39332  783781 
39332  861130 

這樣:

VistNumber ID1 ID2 ID3 ID4 ID5 
39332  759666 769445 775795 783781 861130 
40329  762595 769447 775796 783782 NULL 

我想使用PIVOT的,但我不知道究竟如何由於我沒有使用Count(),Min(),Max()等等,所以做了數據透視部分。 任何幫助/建議,將不勝感激。

+0

你使用MSSQL服務器? – valex

+0

是的,我正在使用MSSQL服務器。 – Kenry87

+0

你是否需要在單獨的列或ID列表中的ID? VisitNumber可以有多於5個ID嗎? – BWS

回答

1

由於您使用的是SQL Server,因此您可以通過幾種不同的方式獲得結果,但所有這些方法都涉及使用row_number()

可以使用聚合函數CASE表達式:

select visitnumber, 
    max(case when seq=1 then id end) ID1, 
    max(case when seq=2 then id end) ID2, 
    max(case when seq=3 then id end) ID3, 
    max(case when seq=4 then id end) ID4, 
    max(case when seq=5 then id end) ID5 
from 
(
    select visitnumber, id, 
    row_number() over(partition by visitnumber 
         order by id) seq 
    from yourtable 
) d 
group by visitnumber; 

SQL Fiddle with Demo

可以使用旋轉功能:

select visitnumber, ID1, ID2, ID3, ID4, ID5 
from 
(
    select visitnumber, id, 
    'ID'+cast(row_number() over(partition by visitnumber 
           order by id) as varchar(10)) seq 
    from yourtable 
) d 
pivot 
(
    max(id) 
    for seq in (ID1, ID2, ID3, ID4, ID5) 
) piv; 

SQL Fiddle with Demo。你說,你只會有一個最大的5分的,但如果你有一個未知的數字,那麼你可以使用動態SQL得到的結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('ID'+cast(row_number() over(partition by visitnumber 
           order by id) as varchar(10))) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT visitnumber,' + @cols + ' 
      from 
      (
       select visitnumber, id, 
        ''ID''+cast(row_number() over(partition by visitnumber 
               order by id) as varchar(10)) seq 
       from yourtable 
      ) x 
      pivot 
      (
       max(id) 
       for seq in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo。所有版本會給結果:

| VISITNUMBER | ID1 | ID2 | ID3 | ID4 | ID5 | 
------------------------------------------------------------ 
|  39332 | 759666 | 769445 | 775795 | 783781 | 861130 | 
|  40329 | 762595 | 769447 | 775796 | 783782 | (null) | 
+0

像樞紐解決方案 –

0
with CTE as 
(

select t.VisitNumber, 
     t.Id, 
     ROW_NUMBER() over (PARTITION BY VisitNumber 
          ORDER BY ID) rn 
from t 
) 

SELECT VisitNumber, 
[1], [2], [3], [4],[5] 
FROM CTE 
PIVOT 
(
AVG(ID) 
FOR RN IN ([1], [2], [3], [4],[5]) 
) AS PivotTable 

SQLFiddle demo

+0

這很好,但我選擇了另一個作爲答案,但因爲如果其他人遇到我的問題將有超過5個ID他們可以使用該答案。 – Kenry87