【问题标题】:Is there a way to return non existent values when using groupby and union all?使用 groupby 和 union all 时有没有办法返回不存在的值?
【发布时间】:2020-09-17 12:21:16
【问题描述】:

我有一个表,我正试图从中返回汇总结果,该表将包含两个数据集,一个用于每月发生的借记交易,另一个用于每月发生的付款。我正在查询的表如下所示:

ID  amount type     created_date
1   200    Debit    2020-02-14
2   150    Payment  2020-02-15
3   200    Payment  2020-02-21
4   100    Debit    2020-03-01
5   100    Debit    2020-03-05
6   50     Payment  2020-04-01
7   150    Payment  2020-04-02

我希望从我的查询中得到一个结果,它为每种类型执行一次 sum(amount) 并将它们联合在一起,以便结果看起来像这样:

month     debit_sum  payment_sum
February  200        350
March     200        0
April     0          200   

到目前为止,我已经得到了以下查询,它返回的数据大多是正确的,但格式错误。

SELECT MONTHNAME(created_date) as month_name, type as type_name, sum(amount) as amount
FROM
(
    SELECT created_date, amount, type
    FROM balance_adjustments
    WHERE type = 'Payment'
    AND created_date > '2020-01-01'
    GROUP BY MONTHNAME(created_date)
    UNION ALL
    SELECT created_date, amount, type
    FROM balance_adjustments
    WHERE type = 'Debit'
    AND created_date > '2020-01-01'
    GROUP BY MONTHNAME(created_date)
) AS adjustments
GROUP BY type, MONTHNAME(created_date) 
ORDER BY created_date;

这将返回以下内容,您可以看到它为每种类型返回一行,但如果没有要求和的值,则不返回一行。如果我可以让它每个月返回 2 行(每种类型一个)并且没有值返回 0,我可以使用这种格式。

month     type_name  amount
February  Debit      200
February  Payment    350
March     Debit      200
April     Payment    200

我想不通的是,是否有一种方法可以返回上面不存在的值填充为 0,或者是否有一种方法可以将 sum(amount) 执行两次,每种类型分别执行一次列。

【问题讨论】:

  • 这能回答你的问题吗? Group by month or 0 if not results?
  • 不是真的,我不想定义它会返回的每个月,我希望能够传递一个日期并获取自该日期以来的所有月份。

标签: mysql sql datetime sum pivot


【解决方案1】:

如果我没听错,你可以使用条件聚合:

select extract(year_month from created_date) created_month,
    sum(case when type = 'Debit'   then amount else 0 end) as debit_sum,
    sum(case when type = 'Payment' then amount else 0 end) as payment_sum
from balance_adjustments
where created_at >= '2020-01-01'
group by created_month

我使用year_month 代替月份的名称,因为您可能不想将不同年份的同一月份计算在一起。如果您愿意,可以将其更改为其他内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多