2012-10-08 151 views
0

我意識到這個問題之前已經以多種形式提出過,但我很努力地將我找到的每一個答案應用到我的具體表格。開始 - 直接看細節。SQL Join Query - Group By/Aggregation

表A有四列(唯一ID,數字,版本,日期)。當從A執行選擇*,結果集如下 -

ID | Number | Revision | Date 
------------------------------------ 
01 | 12345 | 1  | 01/01/2010 
02 | 12345 | 2  | 01/04/2010 
03 | 123 | 1  | 01/12/2010 
04 | 1234 | 1  | 09/09/2012 
05 | 12345 | 3  | 09/12/2012 

我想每個修訂的日期在每數量的單個行,例如對於數字12345,查詢將返回

ID | Number | Revision | Date | Revision 2 | Revision 2 Date | Revision 3 | Revision 3 Date | 
--------------------------------------------------------------------------------------------- 
01 | 12345 | 1 | 01/01/2010 |2 | 01/04/2010  | 3 | 09/12/2012| 

我理解語法將類似於

SELECT Revision, Date 
FROM (
SELECT NUMBER 
FROM A) as B INNER JOIN ON a.Number = B.Number 
GROUP BY a.Number 

然而,這仍然返回一行每種組合,我只想上面顯示的結果。

我將不勝感激任何建議或提示!

+0

你不應該爲兩個表 – StaticVariable

+0

使用相同的冒號名你看到這個帖子? http://stackoverflow.com/questions/1187460/sql-rows-to-columns – martinwnet

+0

樞軸是你需要把你的修訂和日期變成列 http://msdn.microsoft.com/en-us/library/ ms177410(v = sql.105).aspx –

回答

2

您可以同時使用UNPIVOT,然後使用PIVOT來完成此操作。如果你有一個已知數量的值轉換爲列,那麼你可以使用一個靜態PIVOT和硬編碼的值:

select number, [revision_1], [date_1], 
      [revision_2], [date_2], 
      [revision_3], [date_3] 
from 
(
    select number, value, 
    col + '_' + cast(rn as varchar(10)) col 
    from 
    (
    select id, number, cast(revision as varchar(10)) revision, 
     convert(varchar(10), date, 120) date, 
     row_number() over(partition by number order by date) rn 
    from yourtable 
) x 
    unpivot 
    (
    value 
    for col in (revision, date) 
) u 
) x1 
pivot 
(
    max(value) 
    for col in ([revision_1], [date_1], 
      [revision_2], [date_2], 
      [revision_3], [date_3]) 
)p 

SQL Fiddle with Demo

如果你有一個未知數量的值,然後你將需要使用動態SQL來獲取數據。

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 


select @colsPivot = STUFF((SELECT ',' 
         + quotename(c.name + '_' 
         + cast(t.rn as varchar(10))) 
        from 
        (
         select row_number() 
         over(partition by number order by date) rn 
         from yourtable 
        ) t 
        cross apply 
         sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name in ('Revision', 'date') 
        group by c.name, t.rn 
        order by t.rn 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query 
    = 'select * 
     from 
     (
      select number, value, 
      col + ''_'' + cast(rn as varchar(10)) col 
     from 
     (
      select id, number, cast(revision as varchar(10)) revision, 
      convert(varchar(10), date, 120) date, 
      row_number() over(partition by number order by date) rn 
      from yourtable 
     ) x 
     unpivot 
     (
      value 
      for col in (revision, date) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query) 

SQL Fiddle With demo

+0

非常好!謝謝你,但有一個問題,每個日期都是空的,當我從mytable運行select convert(varchar(10),date,120)日期時,日期很好,但是在這兩個查詢中(第二個動態的,那裏根本沒有日期列)日期都是空的。 – znedw

+0

@ user1142132你能用一些示例數據創建一個[SQL小提琴](http://sqlfiddle.com/)供我查看嗎?使用你的示例我沒有得到任何空日期 - http://sqlfiddle.com/#!3/67d11/21 – Taryn

+0

我已經創建了一個sqlfiddle複製我的表和一些示例數據,我沒有得到null日期在http://sqlfiddle.com/#!3/8706a/1,但是這裏是我的結果在sql server中的屏幕截圖http://i.imgur.com/Qx4oN.png – znedw