2014-09-19 155 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