You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:15:39