Php 获取一年中每个月的总金额

Php 获取一年中每个月的总金额,php,mysql,sql,Php,Mysql,Sql,我正在使用MySQL,在那里我需要给定年份的每月总花费(如果给定月份没有花费,那么它应该打印为零)。 上面的查询正是我所需要的,但我在单独的行中获得了总值。 我需要的东西像所有的月份,所有的价值应该在一个单一的行。这样我就可以轻松阅读了。 你很接近了。只需按删除分组即可 不应将日期存储为字符串。在极少数情况下,这是必要的。但我建议您修改类型格式,因此日期存储为日期 其次,您可以使用之类的简化逻辑。如果有字符串,请使用字符串操作: SELECT SUM(CASE MONTH(str_to_dat

我正在使用MySQL,在那里我需要给定年份的每月总花费(如果给定月份没有花费,那么它应该打印为零)。 上面的查询正是我所需要的,但我在单独的行中获得了总值。 我需要的东西像所有的月份,所有的价值应该在一个单一的行。这样我就可以轻松阅读了。
你很接近了。只需按删除
分组即可

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

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

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'))
第三,
YEAR()
返回一个整数,因此比较应该是一个整数。但是,如果该值是字符串,只需执行以下操作:

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

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

谢谢@Gordon,它起作用了。然而,为什么它以前不起作用?是不是因为我已经用CASE语句对月份进行了分组,而不需要再次显式地对它们进行分组。@Roneetshaw。
groupby
描述了一个结果集,每个月都有一个单独的行。我知道更改数据类型是我应该早点做的事情。但是现在我已经走得很远了(下一次我会牢记),认真考虑应用程序中的数据显示问题。code@Strawberry我不明白你想说的,你有PHP,所以用它,而不是sql来格式化你的数据。
WHERE BillDate LIKE '%2017'