【发布时间】:2021-04-18 06:02:48
【问题描述】:
考虑以下架构:
CREATE TABLE `Result` (
`startDate` date NOT NULL,
`description` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`value` decimal(15,4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `Result`
(`startDate`,
`description`,
`value`)
VALUES
('2020-09-01' ,'Allowance' ,4000),
('2020-09-01' ,'Salary' ,1500),
('2020-10-01' ,'Allowance' ,2000),
('2020-10-01' ,'Salary' ,3000),
('2020-10-01' ,'Deduction' ,-200);
给定一个日期,结果应显示为描述和开始日期的总和以及所选日期与上一个日期(月份)之间的差异。因此,如果选择 10 月,则查询结果应显示为,
description SeptemberTotal OctoberTotal Variance
Allowance 4000 2000 -2000
Salary 1500 3000 1500
Deduction 0 -200 -200
我尝试使用联合和枢轴,
SELECT @selectDate:='2020-10-01'; -- set desired date
SELECT
t.month,
t.description,
Gross,
from (
SELECT
DATE_FORMAT(pi.startDate, '%b/%y') AS 'Month',
SUM(pi.value) AS gross,
description
FROM
Result pi
WHERE
pi.startDate = DATE_SUB(@selectDate, INTERVAL 1 MONTH) -- select previous month
GROUP BY description
UNION SELECT
DATE_FORMAT(pi.startDate, '%b/%y') AS 'Month',
SUM(pi.value) AS gross,
description
FROM
Result pi
WHERE
pi.startDate = @selectDate
GROUP BY description) t
GROUP BY t.Month,t.description
;
结果为,
Month description Gross
Sep/20 Allowance 4000
Sep/20 Salary 1500
Oct/20 Allowance 2000
Oct/20 Salary 3000
Oct/20 Deduction -200
这并不完全符合要求。我也尝试过数据透视查询,但也没有按要求显示输出。
【问题讨论】:
-
添加 MonthYear 检索子查询作为基础(或在 CTE 中生成),LEFT JOIN 另一个 src 表副本。使用客户的报告子系统进行透视。
-
@Strawberry 在这种情况下将是 10 月总计 - 9 月总计,我已经编辑了所需的输出