MySQL 的原始答案
你的查询主要有两个错误:
-
FORMAT 是一个将数字转换为字符串的函数。因此,MySQL 会首先将您的日期转换为数字(这甚至不可能并引发错误,但 MySQL 确实会将其转换为某个数字)然后理解格式“yyyy_MM”,可能将 MM 表示为缅甸, 我不知道。我假设您每天获得不同的价值,而不是每月获得一个价值。你想要DATE_FORMAT(date, '%Y-%m')。
- 您尝试按月分组,但随后显示日期。哪个日期?一个月最多有 31 个不同的日期。您必须改为显示分组依据的月份(即再次
DATE_FORMAT(date, '%Y-%m'))。
关于正负数的分离,可以使用条件聚合,即聚合函数中的CASE WHEN(SUM)。
SELECT
DATE_FORMAT(date, '%Y-%m') AS month,
article,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY DATE_FORMAT(date, '%Y-%m'), article
ORDER BY DATE_FORMAT(date, '%Y-%m'), article;
SQL Server 的更新答案
在 SQL Server 中FORMAT(date, 'yyyy_MM') 是一个从日期获取年月的函数。因此查询是:
SELECT
FORMAT(date, 'yyyy_MM') AS month,
article,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY FORMAT(date, 'yyyy_MM'), article
ORDER BY FORMAT(date, 'yyyy_MM'), article;