简体   繁体   English

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

[英]Get total amount for each month in a year

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'))

I am working with MySQL where I need the total Amount spend each month for a given year (If for a given month there is no amount spend then it should print Zero).我正在使用 MySQL,我需要给定年份每个月的总支出金额(如果给定月份没有支出金额,那么它应该打印零)。 The above query does exactly what I need but I get the total values in separate rows.上面的查询正是我需要的,但我在不同的行中获得了总值。 I need something like for all the months all the value should come in one single row.我需要像所有月份所有的价值都应该放在一行中的东西。 So that I can read easily.这样我就可以轻松阅读了。 结果我得到

You are close.你很近。 Just remove the GROUP BY .只需删除GROUP BY

You should not be storing dates as strings.您不应该将日期存储为字符串。 On rare occasions, that is necessary.在极少数情况下,这是必要的。 But I would advise you to fix the type format, so the date is stored as a date.但是我建议您修复类型格式,以便将日期存储为日期。

Second, you can simplify the logic using like .其次,您可以使用like来简化逻辑。 If you have strings, use string operations:如果您有字符串,请使用字符串操作:

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

Third, YEAR() returns an integer, so the comparison should be to an integer.第三, YEAR()返回一个整数,所以比较应该是一个整数。 However, given that the value is a string, just do:但是,鉴于该值是一个字符串,只需执行以下操作:

WHERE BillDate LIKE '%2017'

Or, as mentioned earlier, fix your data so you are storing dates using the proper data type.或者,如前所述,修复您的数据,以便使用正确的数据类型存储日期。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM