2014-09-19 160 views
0

全部,在無透視函數的SQL中創建數據透視表

我有下表。

SalesDate SubChannel  Country NetQuantity 
20140826 TV Attributable  CA   194 
20140826 Unknown    CA   60 
20140826 Web Property   CA   64 
20140826 Overall    CA   264 
20140826 Search    CA   70 

我想將此信息顯示爲數據透視表。

在我使用下面的一段代碼來實現這一點之前,但我必須遷移到的當前系統不支持pivot函數。

Select  SalesDate, 
    Country, 
    [Search], 
    [Unknown], 
    [Web Property], 
    [TV Attributable], 
    [Overall] 
From temp 
PIVOT 
(
Sum([NetQuantity]) 
FOR [SubChannel] IN ([Search],[Unknown],[Web Property],[TV Attributable],[Overall]) 
) as p 

有人可以幫我完成以下的輸出:

SalesDate Country Search Unknown WebProperty  TVAttributable  Overall 
20140826   CA  70  60   64     194   264 
+0

什麼系統是您使用?如果不支持pivot,可能會有一些silimar函數。 – jpw 2014-09-19 17:00:00

+0

我搜索所有的文檔,甚至當系統使用psql時,它不支持數據透視功能。所以我只是想找到解決辦法。但到目前爲止,我還沒有能夠提出一個可以做到這一點的查詢。 – Pierre 2014-09-19 17:03:09

+0

你用psql標記了帖子,是你正在使用的Postgresql嗎? – jpw 2014-09-19 17:03:49

回答

0

您可以使用CASE語句以GROUP BY做轉動「手動」;

SELECT "SalesDate", MAX("Country") "Country", 
    MAX(CASE WHEN "SubChannel"='Search' 
      THEN "NetQuantity" END) "Search", 
    MAX(CASE WHEN "SubChannel"='Unknown' 
      THEN "NetQuantity" END) "Unknown", 
    MAX(CASE WHEN "SubChannel"='Web Property' 
      THEN "NetQuantity" END) "WebProperty", 
    MAX(CASE WHEN "SubChannel"='TV Attributable' 
      THEN "NetQuantity" END) "TVAttributable", 
    MAX(CASE WHEN "SubChannel"='Overall' 
      THEN "NetQuantity" END) "Overall" 
FROM temp 
GROUP BY "SalesDate"; 

An SQLfiddle to test with

基本上,CASE語句在子通道匹配時選取一個值,如果不匹配則返回空值。然後使用MAX爲每個子通道選擇最大(非空)匹配。

如果銷售日期需要按國家拆分,則可以用「國家/地區」替換MAX("Country")表達式,然後將國家/地區添加到GROUP BY

+1

非常感謝!這工作完美。 – Pierre 2014-09-19 17:15:32

0

您可以使用CASE來確定爲每個類別總結的內容。正如你在示例中使用支點SUM,我想你可能想要這個,而不是MAX:

Select 
    "SalesDate", 
    "Country", 
    sum(case when "SubChannel" = 'Search' then "NetQuantity" else 0 end) "Search", 
    sum(case when "SubChannel" = 'Unknown' then "NetQuantity" else 0 end) "Unknown", 
    sum(case when "SubChannel" = 'Web Property' then "NetQuantity" else 0 end) "Web Property", 
    sum(case when "SubChannel" = 'TV Attributable' then "NetQuantity" else 0 end) "TV Attributable", 
    sum(case when "SubChannel" = 'Overall' then "NetQuantity" else 0 end) "Overall" 
from temp 
group by "SalesDate", "Country" 

Sample SQL Fiddle

+0

JPW,你是對的,我需要做一筆款項。 – Pierre 2014-09-19 17:32:22

+0

@Pierre我是這麼認爲的。 – jpw 2014-09-19 17:50:54