我有一个带有类型,开始日期,结束日期和金额的活动表。我想使用开始日期和结束日期来计算所有季度按类型分组的金额总和。
例如,如果我的StartDate和EndDate介于1月到3月之间,则应计算与该季度有关的所有记录的金额之和。
我想对其余记录执行相同的操作。
CREATE TABLE activity
(id int(11)
,Type varchar(10)
,StartDate date
,EndDate date
,Amount int(11)
);
INSERT INTO activity VALUES
(1,'Type1','2021-01-15','2021-02-25',10000),
(2,'Type1','2021-01-25','2021-02-25',10000),
(3,'Type2','2021-08-05','2021-09-25',15000),
(4,'Type3','2021-10-15','2021-12-25',5000);
这是预期的输出。
预期的输出:
Type T1 T2 T3 T4
1 2000 0 0 0
2 0 2000 0 0
3 0 0 0 3000
T1,T2,T3,T4 are quarters of Year
T1 -> Jan TO Mar
T2 -> April TO June
T3 -> July TO September
T4 -> October TO December
我试过查询。我已经在在线编辑器中给出了该查询。
查询中我缺少什么以获取正确的响应?
您可以在日历表的帮助下满足此要求,在这种情况下,日历表将维护每个季度的日期范围:
SELECT
a.Type,
SUM(CASE WHEN quarter = 'T1' THEN a.Amount ELSE 0 END) AS T1,
SUM(CASE WHEN quarter = 'T2' THEN a.Amount ELSE 0 END) AS T2,
SUM(CASE WHEN quarter = 'T3' THEN a.Amount ELSE 0 END) AS T3,
SUM(CASE WHEN quarter = 'T4' THEN a.Amount ELSE 0 END) AS T4
FROM Activity a
INNER JOIN
(
SELECT 'T1' AS quarter, '2021-01-01' AS QuarterStart, '2021-04-01' AS QuarterEnd UNION ALL
SELECT 'T2', '2021-04-01', '2021-07-01' UNION ALL
SELECT 'T3', '2021-07-01', '2021-10-01' UNION ALL
SELECT 'T4', '2021-10-01', '2022-01-01'
) q
ON a.StartDate < q.QuarterEnd AND a.EndDate >= q.QuarterStart
GROUP BY
a.Type;
请注意,我更改了样本数据,因为当前的Type 2数据实际上跨越了第二个季度和第三个季度,并且您并不清楚这种情况下会计的工作方式。因此,我将该数据的结束日期更改为2020-06-30,以确保该日期仅在第二季度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句