SQL Server多行转多列:按包装类型整合产品条码与尺寸
解决方案
目标表结构
最终输出表包含以下字段:
Product No:产品编号Barcode:条码UCC_Length:UCC包装类型对应的长度(无对应值时显示NA)UCC_Width:UCC包装类型对应的宽度(无对应值时显示NA)UPC_Length:UPC包装类型对应的长度(无对应值时显示NA)UPC_Width:UPC包装类型对应的宽度(无对应值时显示NA)
SQL实现语句
WITH product_pkg_counts AS ( -- 统计每个产品的包装类型数量 SELECT "Product No", COUNT(DISTINCT "Package Type") AS pkg_type_count FROM product_table GROUP BY "Product No" ), filtered_products AS ( -- 筛选符合要求的行:双包装类型仅留UCC,单包装类型保留原行 SELECT p."Product No", p."Barcode", p."Package Type", p."Length", p."Width" FROM product_table p JOIN product_pkg_counts c ON p."Product No" = c."Product No" WHERE (c.pkg_type_count = 1) OR (c.pkg_type_count = 2 AND p."Package Type" = 'UCC') ) -- 转置包装类型的长宽为独立列 SELECT "Product No", "Barcode", MAX(CASE WHEN "Package Type" = 'UCC' THEN "Length" ELSE 'NA' END) AS UCC_Length, MAX(CASE WHEN "Package Type" = 'UCC' THEN "Width" ELSE 'NA' END) AS UCC_Width, MAX(CASE WHEN "Package Type" = 'UPC' THEN "Length" ELSE 'NA' END) AS UPC_Length, MAX(CASE WHEN "Package Type" = 'UPC' THEN "Width" ELSE 'NA' END) AS UPC_Width FROM filtered_products GROUP BY "Product No", "Barcode";
逻辑说明
- 统计包装类型数量:通过CTE
product_pkg_counts按产品编号分组,统计每个产品的包装类型总数,用来区分单/双包装类型的产品。 - 筛选目标行:在CTE
filtered_products中,根据统计结果筛选数据——单包装类型的产品保留所有行,双包装类型的产品仅保留Package Type为UCC的行。 - 转置列格式:用
CASE语句结合聚合函数MAX(),将不同包装类型的长宽值转置为独立列,无对应值的位置填充NA。
注:若
Length和Width为数值类型,需将'NA'替换为数据库对应的空值标识(如NULL),后续可在结果展示时转换为NA;若允许文本类型,直接使用'NA'即可。
内容的提问来源于stack exchange,提问作者Mesbah
相关产品推荐
相关产品推荐

