2013-04-08 66 views
0

我有類似的問題,我以前的問題 - Pivot Tables PHP/MySQLPHP SQL Server - 動態錶行和列?

在該查詢我知道行標題將被調用,只需要動態創建列標題。但是,現在我還不知道行標題。

所以我有一個查詢

select eng, count, weekof from dbo.RPT_ENG_WEEK ('2013-03-03', '2013-03-16', '2013-03-03', '2013-03-16') order by eng, weekof asc 

即返回以下數據:

eng  count weekof 
James 11  2013-03-03 
James 12  2013-03-10 
Bill 2  2013-03-03 
Gary 15  2013-03-03 
Gary 5  2013-03-10 
Fred 3  2013-03-03 
Fred 2  2013-03-10 

所以後來我想這變成每一個英行和每樣一個weekof列低於

week: 2013-03-03 2013-03-10 
James:  11    12  
Bill:  2    0   
Gary:  15    5    
Fred:  3    2 

我在上一個問題中得到的答案很有魅力,如果我要提名的英文作爲靜態行,但有可能是100左右eng它可能會返回,並且真的不想手動更新列表!

我可以通過SQL函數中的遊標來解決這個問題,但是有沒有更好的方法呢?

+0

您的其他問題被標記爲MySQL的數據庫,這一個是SQL Server,你使用的是什麼數據庫?這兩個版本的代碼將會非常不同。 – Taryn 2013-04-08 11:37:59

+2

@bluefeet是的,我知道 - 這是一個來自SQL Server,而不是MySQL(其他查詢是) – franglais 2013-04-08 11:38:49

回答

4

將數據從行轉換爲列被稱爲PIVOT。由於您使用的是SQL Server,因此您可以使用pivot函數來獲取結果。

有幾種方法可以做到這一點。如果你有一個已知數量weekof值,那麼你可以硬編碼查詢:

select eng, 
    coalesce([2013-03-03], 0) [2013-03-03], 
    coalesce([2013-03-10], 0) [2013-03-10] 
from 
(
    select eng, [count], weekof 
    from RPT_ENG_WEEK 
) d 
pivot 
(
    sum([count]) 
    for weekof in ([2013-03-03], [2013-03-10]) 
) piv; 

SQL Fiddle with Demo

但如果你有一個未知的數值,那麼你將要實行動態SQL得到的結果:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsNull = STUFF((SELECT distinct ', coalesce(' + QUOTENAME(cast(weekof as date))+', 0) as '+ QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT eng, ' + @colsNull + ' 
      from 
      (
       select eng, [count], cast(weekof as date) weekof 
       from RPT_ENG_WEEK 
      ) x 
      pivot 
      (
       sum([count]) 
       for weekof in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo。兩者都給出結果:

| ENG | 2013-03-03 | 2013-03-10 | 
----------------------------------- 
| Bill |   2 |   0 | 
| Fred |   3 |   2 | 
| Gary |   15 |   5 | 
| James |   11 |   12 | 
+0

我確信這是巫術:D絕對的輝煌! – franglais 2013-04-08 11:49:58

+0

@ sam.clements大聲笑,這就是爲什麼我想確認SQL Server或MySQL,代碼是難以置信的不同,但你會得到相同的結果。 – Taryn 2013-04-08 11:51:14

+0

對不起,但我怎麼才能在PHP中顯示呢?通常我會沿着 的方向做一些事情,而($ obj = sqlsrv_fetch_object($ stmt)){0} {0} = $ obj-> eng; $ count = $ obj-> count; 然後顯示它,但由於我不知道列標題或行標題,我不確定如何顯示它? – franglais 2013-04-08 15:09:09