首页 > 解决方案 > SQL 透视列值

问题描述

我已尝试遵循(SQL Server 特定解决方案),但没有帮助。

我有两张表,ProductSale,我想知道每天售出多少产品。但我想旋转表格,使列成为产品名称,每一行将包含按天订购的每天销售的产品数量。

简化架构如下

CREATE TABLE product (
    id integer,
    name varchar(40),
    price float(2)
);

CREATE TABLE sale(
  id integer,  
  product_id integer,
  transaction_time timestamp
);

这就是我要的

在此处输入图像描述

我只设法汇总每种产品每天的总销售额,但我无法调整产品名称。

select date(sale.transaction_date)
  , product.id
  , product.name
  , count(product_id)
from sale inner join 
  product on sale.product_id = product.id
group by date(sale.transaction_date)
  , product.id
  , product.name

这是目前的情况

在此处输入图像描述

请建议。

标签: sqlpostgresqlpivot

解决方案


您需要旋转逻辑,例如

select
    s.transaction_date::date,
    count(case when p.name = 'intelligent_rubber_clock' then 1 end) as intelligent_rubber_clock,
    count(case when p.name = 'intelligent_iron_wallet' then 1 end) as intelligent_iron_wallet,
    count(case when p.name = 'practical_marble_car' then 1 end) as practical_marble_car
from sale s
inner join product p
    on s.product_id = p.id
group by
    s.transaction_date::date;

GROUP BY由于您的预期输出仅按日期汇总,因此您的条款中应仅包含交易日期。这里使用的技巧是计算一个CASE表达式的计数,当记录来自给定产品时返回 1,否则返回 0。这会为每个产品生成条件计数,所有产品都在单独的列中。要添加更多列,只需添加更多条件计数。


推荐阅读