2017-09-03 50 views
-2

我有一個表結構如下SQL選擇上組數據

Name  Data  Month 
A   100  2016-01 
A   120  2016-03 
A   120  2016-04 
A   150  2016-05 
B   100  2016-03 

我怎樣才能讓最終的結果開始月份和結束月份例如下面之間成爲如果可能的話,2016-01至2016-05使用SQL?

Name  2016-01 2016-02 2016-03  2016-04  2016-05 
A   100  0   120   120  150 
B   0   0   100   0   0 

我做了一些實驗,但無法做到這一點。這是我曾嘗試

select * 
from 
(
    select id, isnull(price,0), [PERIOD] 
    from price_table 
) a 
pivot 
(
    max(price) 
    for [PERIOD] in ([2010-01-01],[2010-02-01]) 
) p 

有錯誤「消息8155,級別16,狀態2碼,10號線 沒有列名是爲‘A’。第2欄指明 消息207,級別16,狀態1,行12 列名'價格'無效。「

也請注意,開始月,結束月份是可變的我的查詢,該月將動態添加更多的也不是真正2016-01至2016-05

+1

什麼SQL數據庫您使用的? MySQL的? SQL Server? PostgreSQL的?它會影響答案。另外,你所要求的具體是如何*數據*即數據行到列。 –

+0

您好我正在使用SQL Server,我也嘗試使用數據透視表,但似乎不能使它的工作,特別是我想使「空」數據的月份變爲0 – onegun

+0

您可以使用'isnull(,0)'來處理這個或'CASE'陳述。您必須將其應用於每個旋轉的列。假設您期望它爲每個月動態添加更多列? –

回答

2

根據你的樣本數據,樞軸查詢將低於

SELECT name, 
     ISNULL([2016-01],0) [2016-01], 
     ISNULL([2016-02],0) [2016-02], 
     ISNULL([2016-03],0) [2016-03], 
     ISNULL([2016-04],0) [2016-04], 
     ISNULL([2016-05],0) [2016-05] 
    FROM t_data 
PIVOT (SUM(data) 
     FOR [month] IN ([2016-01], [2016-02], [2016-03], [2016-04], [2016-05]) 
     ) p 

結果

name 2016-01 2016-02 2016-03 2016-04 2016-05 
A  100  0  120  120  150 
B  0  0  100  0  0 
+0

我覺得這個答案在「SELECT name, ISNULL([2016-01],0)[2016-01]有點硬編碼」我的月份在數據庫中是可變的,它可能不是2016-01 – onegun