获取不同记录的总和并在两个日期范围之间进行比较
Posted
技术标签:
【中文标题】获取不同记录的总和并在两个日期范围之间进行比较【英文标题】:get sum of distinct records and compare between two date ranges 【发布时间】:2021-12-27 20:55:07 【问题描述】:我有一个名为 purchase 的表格,其中包含以下列:名称、金额、城市、日期。
我想返回金额总和并按金额总和最多的城市排序,并比较两个日期范围。
这是一个小提琴:http://sqlfiddle.com/#!9/6b2017/6
我可以按照 sum(amount) desc (period 1) 的顺序获得第一组城市及其 sum(amount):
select distinct city, sum(amount) as total
from purchases
where date between '2020-07-01' and '2020-10-31'
group by city
order by sum(amount) desc
limit 3
上面的查询返回城市:塔尔萨、纽约、芝加哥
但我也想获得前 3 个月的相同查询,但使用上一个查询中返回的相同城市,类似这样,但就像我提到的,我希望它只在一个查询中返回(第 2 期)
select city, sum(amount) as total
from purchases
where city in ('Tulsa', 'New York', 'Chicago')
and date between '2020-03-01' and '2020-06-31'
group by city
希望返回城市(按照它们在第一个查询中的顺序),每个日期范围的总和(数量),所以理论上:
塔尔萨时期 1:总和(金额) 塔尔萨期 2:总和(金额) 纽约期间 1:总和(金额) 纽约期 2:总和(金额) 芝加哥期 1:总和(金额) 芝加哥期 2:总和(金额)
感谢任何帮助
【问题讨论】:
SELECT DISTINCT 结合 GROUP BY 挑眉... 【参考方案1】:使用LEFT
将您的查询连接到表并再次聚合:
SELECT t.city, t.total period1, COALESCE(SUM(p.amount), 0) period2
FROM (
SELECT city, SUM(amount) AS total
FROM purchases
WHERE date BETWEEN '2020-07-01' AND '2020-10-31'
GROUP BY city
ORDER BY total DESC LIMIT 3
) t LEFT JOIN (
SELECT city, amount
FROM purchases
WHERE date BETWEEN '2020-03-01' AND '2020-06-30'
) p ON p.city = t.city
GROUP BY t.city, t.total
ORDER BY t.total DESC;
或者,使用条件聚合:
SELECT city,
SUM(CASE WHEN date BETWEEN '2020-07-01' AND '2020-10-31' THEN amount ELSE 0 END) period1,
SUM(CASE WHEN date BETWEEN '2020-03-01' AND '2020-06-30' THEN amount ELSE 0 END) period2
FROM purchases
GROUP BY city
ORDER BY period1 DESC LIMIT 3;
或者:
SELECT city,
SUM(CASE WHEN date >= '2020-07-01' THEN amount ELSE 0 END) period1,
SUM(CASE WHEN date < '2020-07-01' THEN amount ELSE 0 END) period2
FROM purchases
WHERE date BETWEEN '2020-03-01' AND '2020-10-31'
GROUP BY city
ORDER BY period1 DESC LIMIT 3;
请参阅demo。
【讨论】:
以上是关于获取不同记录的总和并在两个日期范围之间进行比较的主要内容,如果未能解决你的问题,请参考以下文章
获取两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据网格视图
ohlc(open,high,low and close) 两个日期范围之间不同时间的记录内部(1,5,15,60,120)分钟,1 天即使没有记录