在SQL中创建不带透视函数的透视表

在SQL中创建不带透视函数的透视表,sql,postgresql,pivot,psql,Sql,Postgresql,Pivot,Psql,全部, 我有下表 SalesDate SubChannel Country NetQuantity 20140826 TV Attributable CA 194 20140826 Unknown CA 60 20140826 Web Property CA 64 20140826 Overall CA

全部,

我有下表

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
您可以将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";

基本上,CASE语句在子通道匹配时选择一个值,如果不匹配则选择null。然后使用最大值为每个子通道拾取最大的非空匹配


如果销售日期需要按国家划分,您只需将MAXCountry表达式替换为just country并将country添加到GROUP by即可。

您可以使用案例确定每个类别的汇总内容。在示例pivot中使用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"

你用的是什么系统?如果pivot不受支持,可能会有一些silimar函数。我搜索了所有文档,即使系统使用psql,它也不支持pivot函数。所以我只是想找个工作。但到目前为止,我还没能想出一个能起作用的查询。你用psql标记了这篇文章,你用的是Postgresql吗?@Pierre我想是的。