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

如何将表中单条记录的值拆分到多列?SQL Server场景求助

解决SQL Server中同一Master_ID多类型日期合并为单行的问题

问题分析

当前查询通过CASE语句拆分不同类型的日期,但未做聚合操作,导致每个Item_Type_ID生成单独一行,无法将同一Master_ID的所有类型日期合并到同一行。同时原查询的WHERE子句会过滤掉没有匹配指定Item_Type_ID的Master记录,违背了LEFT JOIN的初衷。

修改方案

使用聚合函数(如MAX)包裹CASE语句,再通过GROUP BY按master_id分组,将同一Master_ID的多行记录合并为单行。同时将Item_Type_ID的过滤条件移至JOIN子句中,保留无匹配项的Master记录。

修改后的SQL代码

USE Shipping
GO

SELECT
    vmi.master_id
    ,MAX(CASE WHEN vid.item_type_id = 10 THEN vid.item_date ELSE NULL END) AS Fruit_Item_Date
    ,MAX(CASE WHEN vid.item_type_id = 20 THEN vid.item_date ELSE NULL END) AS Veggie_Item_Date
    ,MAX(CASE WHEN vid.item_type_id = 30 THEN vid.item_date ELSE NULL END) AS Grains_Item_Date
    ,MAX(CASE WHEN vid.item_type_id = 40 THEN vid.item_date ELSE NULL END) AS Meat_Item_Date
FROM v_master_data vmi
LEFT JOIN v_item_data vid 
    ON vmi.master_id = vid.master_id 
    AND vid.item_type_id IN (10,20,30,40) -- 将过滤条件移至JOIN,保留LEFT JOIN效果
GROUP BY vmi.master_id -- 按master_id分组聚合
GO

关键说明

  1. 聚合函数的作用:由于每个Master_ID对应每个Item_Type_ID最多一条记录(根据问题描述),MAX会自动忽略NULL值,提取对应类型的有效日期,将多行合并为单行。
  2. 过滤条件的位置:将vid.item_type_id IN (...)移至ON子句而非WHERE,避免过滤掉没有匹配任何指定类型的Master记录,保持LEFT JOIN的完整性。
  3. 别名规范:去掉了别名的单引号,使用标准的无引号别名(若别名含空格才需用方括号),符合SQL Server最佳实践。

内容的提问来源于stack exchange,提问作者Andrew Fry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:11:50