【问题标题】:Oracle rows to columnsOracle 行到列
【发布时间】:2025-12-07 12:15:01
【问题描述】:

我有一个包含以下列和 2 行的表格:

COL1,COL2,COL3,NAME,DATE

两行中COL1、COL2、COL3的值为A、B、C。第一行中 NAME 的值是“DEL”,第二行是“LAP”。第一行 DATE 的值是“11.12.13”,第二行是“13.11.13”。

现在我想要一个包含单行和以下列的视图

COL1,COL2,COL3,DEL,LAP with values A,B,C,11.12.13,13.11.13.

是否可以通过枢轴或任何其他功能实现

谢谢

【问题讨论】:

  • 嗨...你能告诉方法吗

标签: sql oracle


【解决方案1】:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE table_name (COL1,COL2,COL3,N_NAME,D_DATE) AS 
          SELECT  'A','B','C', 'DEL', '11.12.13' FROM DUAL
UNION ALL SELECT  'A','B','C', 'LAP', '13.11.13' FROM DUAL
UNION ALL SELECT  'A','B','C', 'DEL', '12.12.13' FROM DUAL
UNION ALL SELECT  'A','B','C', 'LAP', '14.11.13' FROM DUAL;

查询 1

如果COL1COL2COL3N_Name 的组合是唯一的,那么您可以这样做:

SELECT Col1,
       Col2,
       Col3,
       MIN( CASE N_Name WHEN 'DEL' THEN D_Date END ) AS DEL,
       MIN( CASE N_Name WHEN 'LAP' THEN D_Date END ) AS LAP
FROM   table_name
GROUP BY
       Col1,
       Col2,
       Col3

Results

| COL1 | COL2 | COL3 |      DEL |      LAP |
|------|------|------|----------|----------|
|    A |    B |    C | 11.12.13 | 13.11.13 |

查询 2

但是,如果您可以有多个行具有相同的 COL1COL2COL3N_Name 组合,并且您希望所有行都返回(按日期顺序),那么您可以这样做:

WITH indexed_data AS (
  SELECT Col1,
         Col2,
         Col3,
         N_Name,
         D_Date,
         ROW_NUMBER() OVER ( PARTITION BY Col1, Col2, Col3, N_Name ORDER BY D_Date ) AS idx
  FROM   table_name  
)
SELECT Col1,
       Col2,
       Col3,
       MIN( CASE N_Name WHEN 'DEL' THEN D_Date END ) AS DEL,
       MIN( CASE N_Name WHEN 'LAP' THEN D_Date END ) AS LAP
FROM   indexed_data
GROUP BY
       Col1,
       Col2,
       Col3,
       idx
ORDER BY
       Col1,
       Col2,
       Col3,
       idx

Results

| COL1 | COL2 | COL3 |      DEL |      LAP |
|------|------|------|----------|----------|
|    A |    B |    C | 11.12.13 | 13.11.13 |
|    A |    B |    C | 12.12.13 | 14.11.13 |

【讨论】:

    【解决方案2】:
    with tab (COL1,COL2,COL3,N_NAME,D_DATE) as ( 
    select  'A','B','C', 'DEL', '11.12.13' from dual union all
    select  'A','B','C', 'LAP', '13.11.13' from dual)
    select COL1, COL2, COL3, 
           min(decode(N_NAME, 'DEL', D_DATE, NULL)) DEL,
           min(DECODE(N_NAME, 'LAP', D_DATE, NULL)) LAP
    from tab
    group by COL1, COL2, COL3 
    

    输出

    | COL1 | COL2 | COL3 |      DEL |      LAP |
    |------|------|------|----------|----------|
    |    A |    B |    C | 11.12.13 | 13.11.13 |
    

    【讨论】:

      【解决方案3】:

      假设两行的公共字段是COL1、COL2和COL3。

      SELECT a.col1, 
             a.col2, 
             a.col3, 
             a.date AS DEL, 
             b.date AS LAP 
      FROM   yourtable AS a 
             INNER JOIN yourtable AS b 
                     ON a.col1 = b.col1 
                        AND a.col2 = b.col2 
                        AND a.col3 = b.col3 
                        AND a.name = 'DEL' 
                        AND b.name = 'LAP' 
      

      【讨论】: