sql - PostgreSQL Group By A,但仍拉取B字段

标签 sql postgresql group-by pivot

我有这样的表:

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_idtotal_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

sqlfiddle demo

您正在按 rpt_date 分组,但没有告诉它其他列应该发生什么。通过这种方式,您可以获得这些日期的 total_usage 的总和。如果您只有一条记录,对于每个日期和每个 shipping_id,它将只返回该值。

关于sql - PostgreSQL Group By A,但仍拉取B字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20175588/

相关文章:

sql - Rails 控制台和 Rails 服务器日志中输出的颜色是什么意思?

sql - 大表中的行数

sql - TSQL - 案例 - 值在?

mysql - 适用于 SQL Server、mySQL 和 postgreSQL 的可移植 SQL

sql - 将表与自身连接时如何排除重复行

sql - 调查数据模型 - 如何避免 EAV 和过度非规范化?

sql - 检查 postgres 中是否出现值 - NodeJS

mysql - 为上个月的总和引入一个新列

MySQL Group By - 获取与 max() 金额关联的行

database - Sequelize 。错误 : null value in column "createdAt" violates not-null constraint