如何将多SQL查询的行结果转为列并合并为单表结果?
合并SQL查询为单一结果集的方法
当然可以,这里提供两种实用方式将三个查询的结果合并为同一表格的列:
方法1:条件聚合(推荐,仅扫描一次表)
这是效率最优的方案,通过CASE WHEN在同一查询中对不同物料分别求和,仅需读取一次数据表:
/* 单日装载统计 - 合并版 */ DECLARE @date1 AS date = '2022-05-07' SELECT SUM(CASE WHEN MainMaterialName = 'EDGB7' THEN EndTotalizerGST - InitialTotalizerGST END) AS EDGB7, SUM(CASE WHEN MainMaterialName = 'BMB95' THEN EndTotalizerGST - InitialTotalizerGST END) AS BMB95, SUM(CASE WHEN MainMaterialName = 'BMB100' THEN EndTotalizerGST - InitialTotalizerGST END) AS BMB100 FROM APSisak.Loading.BatchReport WHERE CAST(StartDateTime AS DATE) = @date1 AND MainMaterialName IN ('EDGB7', 'BMB95', 'BMB100')
说明:
- 用
CASE WHEN筛选对应物料的行,仅对符合条件的行计算差值并求和 - 优化了原查询的
LIKE:CAST(StartDateTime AS DATE)是日期类型,直接用=匹配@date1更准确高效,避免字符串匹配的潜在问题 IN子句缩小筛选范围,进一步提升查询性能
方法2:子查询作为列
如果偏好更直观的写法,也可以将每个原查询作为独立子查询,作为结果的列返回:
/* 单日装载统计 - 子查询版 */ DECLARE @date1 AS date = '2022-05-07' SELECT (SELECT SUM(EndTotalizerGST-InitialTotalizerGST) FROM APSisak.Loading.BatchReport WHERE CAST(StartDateTime AS DATE) = @date1 AND MainMaterialName = 'EDGB7') AS EDGB7, (SELECT SUM(EndTotalizerGST-InitialTotalizerGST) FROM APSisak.Loading.BatchReport WHERE CAST(StartDateTime AS DATE) = @date1 AND MainMaterialName = 'BMB95') AS BMB95, (SELECT SUM(EndTotalizerGST-InitialTotalizerGST) FROM APSisak.Loading.BatchReport WHERE CAST(StartDateTime AS DATE) = @date1 AND MainMaterialName = 'BMB100') AS BMB100
说明:
- 每个子查询对应一个统计列,逻辑和原查询完全一致
- 缺点是会三次扫描数据表,数据量大时性能不如条件聚合
内容的提问来源于stack exchange,提问作者Matija Sovic
相关产品推荐
相关产品推荐

