如何将表中单条记录的值拆分到多列?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
关键说明
- 聚合函数的作用:由于每个
Master_ID对应每个Item_Type_ID最多一条记录(根据问题描述),MAX会自动忽略NULL值,提取对应类型的有效日期,将多行合并为单行。 - 过滤条件的位置:将
vid.item_type_id IN (...)移至ON子句而非WHERE,避免过滤掉没有匹配任何指定类型的Master记录,保持LEFT JOIN的完整性。 - 别名规范:去掉了别名的单引号,使用标准的无引号别名(若别名含空格才需用方括号),符合SQL Server最佳实践。
内容的提问来源于stack exchange,提问作者Andrew Fry
相关产品推荐
相关产品推荐

