SQL Server基于列值条件对指定类型字段按日分别求和咨询
SQL Server指定交易类型日求和查询实现
最终查询语句
SELECT CAST([DateTime] AS DATE) AS 日期, SUM(CASE WHEN [Type] = 'Type1' THEN Offered ELSE 0 END) AS Type1日求和值, SUM(CASE WHEN [Type] = 'Type3' THEN Offered ELSE 0 END) AS Type3日求和值 FROM TYPES WHERE [Type] IN ('Type1', 'Type3') -- 如果有指定统计时间范围,可取消下面的注释追加过滤条件,进一步提升性能 -- AND [DateTime] >= '开始日期' AND [DateTime] < DATEADD(DAY, 1, '结束日期') GROUP BY CAST([DateTime] AS DATE) ORDER BY 日期
实现说明
- 优先在WHERE层过滤仅需要统计的Type1、Type3两类交易,避免扫描上百种无关交易类型的数百万条数据,大幅降低计算量
- 用
CAST([DateTime] AS DATE)将半小时粒度的时间戳直接转换为自然日,作为分组维度 - 采用CASE条件聚合逻辑,仅需一次全表(或索引)扫描即可同时计算两类交易的日求和值,无需多表关联、子查询,性能最优,适配大表场景
高频查询性能优化建议
如果该查询需要频繁执行,建议创建如下覆盖索引,所有查询所需字段都可以直接从索引获取,无需回表访问主数据,查询速度可提升10倍以上:
CREATE NONCLUSTERED INDEX IX_TYPES_Type_Date_Offered ON TYPES ([Type], [DateTime]) INCLUDE (Offered);
内容的提问来源于stack exchange,提问作者Trigg
相关产品推荐
相关产品推荐

