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

Oracle SQL Developer行转列需求:实现无重复列的指定输出

Oracle SQL 多行转指定列格式解决方案

原始Purchased表数据

Customer_IDLast_NameFirst_nameProductPurchasedServiceWarranty
50SmithJohnCar01/06/200702/06/200810
50SmithJohnSUV03/11/200504/11/200615
50SmithJohnTruck07/05/200408/05/200520
20McGregorKatieCar11/01/200612/01/200610
11YangKarenCar a21/07/200622/08/200710
11YangKarenCar b10/09/200511/09/200610
90WilkinsMelissaSUV25/05/200526/05/200610
90WilkinsMelissaCar a10/07/200511/07/200610
90WilkinsMelissa4WD05/11/200306/11/200415
90WilkinsMelissaCar b29/03/200130/03/200210
135BarnesTom4WD02/08/200803/08/200915

期望输出格式

Customer_IDLast_NameFirst_name4WDCarCar aCar bSUVTruckWarranty_4WDWarranty_CarWarranty_CarAWarraty_CarBWarranty_SUVWarranty_Truck
50SmithJohn01/06/200703/11/200507/05/2004101520
20McGregorKatie11/01/2006
11YangKaren21/07/200610/09/20051010
90WilkinsMelissa05/11/200310/07/200529/03/200125/05/2005151010
135BarnesTom02/08/200815

实现SQL语句

SELECT
    Customer_ID,
    Last_Name,
    First_name,
    -- 生成产品购买日期列
    MAX(CASE WHEN Product = '4WD' THEN Purchased END) AS "4WD",
    MAX(CASE WHEN Product = 'Car' THEN Purchased END) AS "Car",
    MAX(CASE WHEN Product = 'Car a' THEN Purchased END) AS "Car a",
    MAX(CASE WHEN Product = 'Car b' THEN Purchased END) AS "Car b",
    MAX(CASE WHEN Product = 'SUV' THEN Purchased END) AS "SUV",
    MAX(CASE WHEN Product = 'Truck' THEN Purchased END) AS "Truck",
    -- 生成保修期限列
    MAX(CASE WHEN Product = '4WD' THEN Warranty END) AS "Warranty_4WD",
    MAX(CASE WHEN Product = 'Car' THEN Warranty END) AS "Warranty_Car",
    MAX(CASE WHEN Product = 'Car a' THEN Warranty END) AS "Warranty_CarA",
    MAX(CASE WHEN Product = 'Car b' THEN Warranty END) AS "Warraty_CarB",
    MAX(CASE WHEN Product = 'SUV' THEN Warranty END) AS "Warranty_SUV",
    MAX(CASE WHEN Product = 'Truck' THEN Warranty END) AS "Warranty_Truck"
FROM Purchased
GROUP BY Customer_ID, Last_Name, First_name
ORDER BY Customer_ID;

说明

  • 采用条件聚合+GROUP BY的方式,通过CASE WHEN匹配每个产品类型,用MAX提取对应记录的值(因每个客户对应单个产品仅一条记录,MAX/MIN效果一致)。
  • 相比PIVOT语法,这种方式更直观,能完全按照需求指定列名和顺序,避免PIVOT可能出现的列名混乱、重复问题。
  • 列名包含空格或特殊格式时,需用双引号包裹,Oracle会保留原始格式与大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11