Oracle SQL Developer行转列需求:实现无重复列的指定输出
Oracle SQL 多行转指定列格式解决方案
原始Purchased表数据
| Customer_ID | Last_Name | First_name | Product | Purchased | Service | Warranty |
|---|---|---|---|---|---|---|
| 50 | Smith | John | Car | 01/06/2007 | 02/06/2008 | 10 |
| 50 | Smith | John | SUV | 03/11/2005 | 04/11/2006 | 15 |
| 50 | Smith | John | Truck | 07/05/2004 | 08/05/2005 | 20 |
| 20 | McGregor | Katie | Car | 11/01/2006 | 12/01/2006 | 10 |
| 11 | Yang | Karen | Car a | 21/07/2006 | 22/08/2007 | 10 |
| 11 | Yang | Karen | Car b | 10/09/2005 | 11/09/2006 | 10 |
| 90 | Wilkins | Melissa | SUV | 25/05/2005 | 26/05/2006 | 10 |
| 90 | Wilkins | Melissa | Car a | 10/07/2005 | 11/07/2006 | 10 |
| 90 | Wilkins | Melissa | 4WD | 05/11/2003 | 06/11/2004 | 15 |
| 90 | Wilkins | Melissa | Car b | 29/03/2001 | 30/03/2002 | 10 |
| 135 | Barnes | Tom | 4WD | 02/08/2008 | 03/08/2009 | 15 |
期望输出格式
| Customer_ID | Last_Name | First_name | 4WD | Car | Car a | Car b | SUV | Truck | Warranty_4WD | Warranty_Car | Warranty_CarA | Warraty_CarB | Warranty_SUV | Warranty_Truck |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 50 | Smith | John | 01/06/2007 | 03/11/2005 | 07/05/2004 | 10 | 15 | 20 | ||||||
| 20 | McGregor | Katie | 11/01/2006 | |||||||||||
| 11 | Yang | Karen | 21/07/2006 | 10/09/2005 | 10 | 10 | ||||||||
| 90 | Wilkins | Melissa | 05/11/2003 | 10/07/2005 | 29/03/2001 | 25/05/2005 | 15 | 10 | 10 | |||||
| 135 | Barnes | Tom | 02/08/2008 | 15 |
实现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
相关产品推荐
相关产品推荐

