假设一个包含CustId, Amount, DatePosted
列的采购事务处理表,其中Amount是事务处理的值,DatePosted是DATETIME值。给定一个特定的CustId,如何编写select语句,使其返回包含以下列的单行:CustId
,过去3天、过去60天、1年、2年的交易总值(共5列)。
示例表:
| 客户ID|金额|发布日期|
| - ------|- ------|- ------|
| 1234|六百九十八点零二分|2023年1月23日12时34分56秒|
| 1234|五百八十二点六九|2022年12月15日19时57分23秒|
| 1234|小行星7775.22|2022年12月2日零时2分34秒32|
| 1234|十八点七二分|2022年1月23日12时34分56秒|
| 1234|二点二七分|2021年1月23日12时34分56秒|
使用CustId=1234进行搜索时,上述示例数据的预期输出为:
| 客户ID|3天总计|60天总计|1年共计|2年共计|
| - ------|- ------|- ------|- ------|- ------|
| 1234|六百九十八点零二分|小行星9055.93|九千零七十四点六五|小行星9076.92|
3条答案
按热度按时间zfycwa2u1#
您可以获取过去2年的所有购买数据,然后使用SUM和SQL CASE expression计算每个时间范围的总值。
演示版:http://sqlfiddle.com/#!18/9 eecb/179880
r7xajy2e2#
此查询假定最长为2年。如果您想继续返回,则还需更改where子句。无需使用合并或派生表。SQL Server查询规划器可能足够智能,可以为所有这些解决方案提供类似的性能,但这更易于理解:
fiei3ece3#
这样设置后,您可以设置@CustID = null,查询将返回集合中所有客户的结果。
编辑:更新了我下面的查询,让你在你想要的范围内获得更多的灵活性,如果你想得到额外的启发式。(计数,平均值,等)也删除了合并,因为它根本不需要在这里。