我有一个表(帐户),其中包含帐户组和帐户的连接日期,以及其他字段。使用MySQL版本5.5.35-cll。
基本上我正在尝试做的是计算每个帐户组每个月发生的“注册”数量。 (不仅是每月的总金额 - 需要知道每个帐户组每月发生的注册数量)。
所以结果看起来像这样:
intended results http://imageshack.com/a/img842/9105/drh9.gif
我尝试了一些不同的方法,但只是成功地获得了我需要的一个月,而不是一年中的所有月份。当我尝试使用SUM时,它看起来像是在工作,但它没有按预期工作 - 似乎它认为每组每月最多注册1次,而实际上至少有4或5个一些团体。
这是我最近(失败)尝试使用SUM:
SELECT accountgroup,
SUM( IF( MONTH =1, numRecords, 0 ) AND YEAR=2014) AS 'January',
SUM( IF( MONTH =2, numRecords, 0 ) AND YEAR=2014) AS 'February',
SUM( IF( MONTH =3, numRecords, 0 ) AND YEAR=2014) AS 'March',
SUM( IF( MONTH =4, numRecords, 0 ) AND YEAR=2014) AS 'April',
SUM( IF( MONTH =5, numRecords, 0 ) AND YEAR=2014) AS 'May',
SUM( IF( MONTH =6, numRecords, 0 ) AND YEAR=2014) AS 'June',
SUM( IF( MONTH =7, numRecords, 0 ) AND YEAR=2014) AS 'July',
SUM( IF( MONTH =8, numRecords, 0 ) AND YEAR=2014) AS 'August',
SUM( IF( MONTH =9, numRecords, 0 ) AND YEAR=2014) AS 'September',
SUM( IF( MONTH =10, numRecords, 0 ) AND YEAR=2014) AS 'October',
SUM( IF( MONTH =11, numRecords, 0 ) AND YEAR=2014) AS 'November',
SUM( IF( MONTH =12, numRecords, 0 ) AND YEAR=2014) AS 'December',
SUM( numRecords ) AS total
FROM (
SELECT accountgroup, MONTH( joineddate ) AS MONTH, YEAR( joineddate ) AS YEAR, COUNT( * ) AS numRecords
FROM accounts
WHERE accountgroup <>''
GROUP BY accountgroup, MONTH, YEAR) AS SubTable1
GROUP BY accountgroup");
任何人都可以告诉我该怎么做?我很难过:(
提前感谢您的帮助。
答案 0 :(得分:1)
你非常接近。您需要将year
条件放在if
内。例如:
SUM(IF(MONTH = 1 AND YEAR = 2014, numRecords, 0)) AS January,
SUM(IF(MONTH = 2 AND YEAR = 2014, numRecords, 0)) AS February,
. . .
您不需要最后的括号。因此,查询应如下所示:
SELECT accountgroup,
SUM(IF(MONTH = 1 AND YEAR = 2014, numRecords, 0)) AS January,
SUM(IF(MONTH = 2 AND YEAR = 2014, numRecords, 0)) AS February,
. . .
SUM( numRecords ) AS total
FROM (SELECT accountgroup, MONTH( joineddate ) AS MONTH, YEAR( joineddate ) AS YEAR, COUNT( * ) AS numRecords
FROM accounts
WHERE accountgroup <>''
GROUP BY accountgroup, MONTH, YEAR
) AS SubTable1
GROUP BY accountgroup";
此外,不要对应该是列名或表名的内容使用单引号。在这种情况下,您不需要转义这些名称。使用双引号或反引号。仅对字符串和日期常量使用单引号。