【问题标题】:Get total amount for each month in a year获取一年中每个月的总金额
【发布时间】:2017-12-25 19:17:12
【问题描述】:
SELECT 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 1 THEN sm.GrandTotal ELSE 0 END) AS 'January',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 2 THEN sm.GrandTotal ELSE 0 END) AS 'February',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 3 THEN sm.GrandTotal ELSE 0 END) AS 'March',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 4 THEN sm.GrandTotal ELSE 0 END) AS 'April',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 5 THEN sm.GrandTotal ELSE 0 END) AS 'May',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 6 THEN sm.GrandTotal ELSE 0 END) AS 'June',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 7 THEN sm.GrandTotal ELSE 0 END) AS 'July',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 8 THEN sm.GrandTotal ELSE 0 END) AS 'August',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 9 THEN sm.GrandTotal ELSE 0 END) AS 'September',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 10 THEN sm.GrandTotal ELSE 0 END) AS 'October',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 11 THEN sm.GrandTotal ELSE 0 END) AS 'November',
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 12 THEN sm.GrandTotal ELSE 0 END) AS 'December'
FROM
  sales_master sm
WHERE
  YEAR(str_to_date(sm.BillDate, '%d/%m/%Y'))='2017'
GROUP BY 
  MONTH(str_to_date(sm.BillDate, '%d/%m/%Y'))

我正在使用 MySQL,我需要给定年份每个月的总支出(如果给定月份没有支出金额,那么它应该打印为零)。 上面的查询完全符合我的需要,但我在单独的行中获得了总值。 我需要像所有月份一样的东西,所有的价值都应该放在一行中。这样我就可以轻松阅读。

【问题讨论】:

  • 认真考虑处理应用代码中数据显示的问题
  • @Strawberry 我没听懂你想说什么
  • 你有 PHP,所以使用 PHP 而不是 sql 来格式化你的数据。

标签: php mysql sql


【解决方案1】:

你很接近。只需删除GROUP BY

您不应该将日期存储为字符串。在极少数情况下,这是必要的。但我建议您修复类型格式,以便将日期存储为日期。

其次,您可以使用like 简化逻辑。如果您有字符串,请使用字符串操作:

SELECT SUM(CASE WHEN sm.BillDate LIKE '%/01/%' THEN sm.GrandTotal ELSE 0 END) AS January,
       . . .

第三,YEAR()返回一个整数,所以比较应该是一个整数。但是,鉴于该值是一个字符串,只需执行以下操作:

WHERE BillDate LIKE '%2017'

或者,如前所述,修复您的数据,以便使用正确的数据类型存储日期。

【讨论】:

  • 谢谢@Gordon 成功了。但是,为什么它以前不起作用?是不是因为我已经用 CASE 语句对月份进行了分组,并且不需要再次明确地对它们进行分组。
  • @Roneetshaw。 . . GROUP BY 描述了一个结果集,每个月都有一个单独的行。
  • 我知道更改数据类型是我应该早点做的事情。但是现在我已经走了很远:(。下次我会记住的。
最近更新 更多