我有这样的表:
rpt_date | shipping_id | total_usage
--------------------------------------
2013-11-01 | 1 | 10
2013-11-01 | 2 | 2
2013-11-01 | 3 | 5
2013-11-02 | 1 | 15
2013-11-02 | 4 | 1
2013-11-03 | 1 | 20
2013-11-03 | 2 | 3
我想使用单个查询来获得这样的结果:
rpt_date | 1 (shipping _id) | 2 (shipping_id) | 3 (shipping_id) | 4 (shipping_id)
-----------------------------------------------------------------------------------
2013-11-01 | 10 (total_usage) | 2 | 5 | 0
2013-11-02 | 15 | 0 | 0 | 1
2013-11-03 | 20 | 3 | 0 | 0
我该如何查询呢?我正在尝试这样查询
SELECT
rpt_date,
CASE WHEN shipping_id = 1 THEN total_usage ELSE 0 END AS a,
CASE WHEN shipping_id = 2 THEN total_usage ELSE 0 END AS b,
CASE WHEN shipping_id = 3 THEN total_usage ELSE 0 END AS c,
CASE WHEN shipping_id = 4 THEN total_usage ELSE 0 END AS d
FROM
Table A
WHERE
DATE(rpt_date) BETWEEN '2013-11-01' AND '2013-11-03'
GROUP BY
rpt_date
ORDER BY
rpt_date
上面的查询提示错误,shipping_id
和 total_usage
必须是 GROUP BY
的一部分。我的查询有什么问题?
最佳答案
用 SUM 试试:
SELECT
rpt_date,
SUM(CASE WHEN shipping_id = 1 THEN total_usage ELSE 0 END) AS a,
SUM(CASE WHEN shipping_id = 2 THEN total_usage ELSE 0 END) AS b,
SUM(CASE WHEN shipping_id = 3 THEN total_usage ELSE 0 END) AS c,
SUM(CASE WHEN shipping_id = 4 THEN total_usage ELSE 0 END) AS d
FROM TableA
WHERE DATE(rpt_date) BETWEEN '2013-11-01' AND '2013-11-03'
GROUP BY rpt_date
ORDER BY rpt_date
您正在按 rpt_date 分组,但没有告诉它其他列应该发生什么。通过这种方式,您可以获得这些日期的 total_usage 的总和。如果您只有一条记录,对于每个日期和每个 shipping_id,它将只返回该值。
关于sql - PostgreSQL Group By A,但仍拉取B字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20175588/