【问题标题】:PostgreSQL Group By A, but still pull B fieldPostgreSQL Group By A,但仍然拉 B 字段
【发布时间】:2013-11-24 14:18:59
【问题描述】:

我的表格是这样的:

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 的一部分的错误。我的查询有什么问题?

【问题讨论】:

  • 它给出了这一点,因为它不知道如何处理 total_usage,它不是“清楚的”。你告诉它按某事分组,但没有告诉它如何处理另一个。为什么还要分组?你没有用它做任何事情(没有分组功能)
  • Total_usage 正在设置但从未使用过 - 为什么要麻烦?
  • 是的,我知道我的查询是错误的。我的观点是如何使用单个查询来获得上面提到的结果?可能你有其他方法来查询得到上面的结果吗?非常感谢您的帮助.. tq

标签: sql postgresql group-by pivot


【解决方案1】:

用 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,它将仅返回该值。

【讨论】:

    【解决方案2】:

    您的查询已结束。获得此枢轴结果的一种方法如下:

    SELECT 
      rpt_date,
      MAX(CASE WHEN shipping_id = 1 THEN total_usage ELSE 0 END) AS a,
      MAX(CASE WHEN shipping_id = 2 THEN total_usage ELSE 0 END) AS b,
      MAX(CASE WHEN shipping_id = 3 THEN total_usage ELSE 0 END) AS c,
      MAX(CASE WHEN shipping_id = 4 THEN total_usage ELSE 0 END) AS d
    FROM 
      Table A
    WHERE 
      rpt_date BETWEEN '2013-11-01' AND '2013-11-03' 
    GROUP BY 
      rpt_date 
    ORDER BY 
      rpt_date ;
    

    【讨论】:

    • tq 它也可以,我宁愿使用 SUM 而不是 MAX ...... tq 非常兄弟 :)
    • 是的,我应该补充一点,我的查询基于(rpt_date, shipping_id) 存在唯一约束的假设。使用SUM(),即使没有,它也应该可以工作。
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-12-23
    • 2012-10-30
    相关资源
    最近更新 更多