多个Unpivot或For的列

时间:2017-05-23 11:16:33

标签: oracle oracle11g unpivot

我有以下表结构

CREATE TABLE test_unpivot
(
   prod_id              NUMBER,
   prod_name_reuse      VARCHAR2 (1),
   prod_cat_reuse       VARCHAR2 (1),
   prod_name_transfer   VARCHAR2 (1),
   prod_cat_transfer    VARCHAR2 (1),
   remarks              VARCHAR2 (10)
);

我正在使用unpivot

    SELECT prod_id, value1, col1
  FROM test_unpivot2 UNPIVOT (value1
                     FOR col1
                     IN (prod_name_reuse, prod_cat_reuse))
 WHERE prod_id = 120

并将结果显示为

+---------+--------+-----------------+
| PROD_ID | VALUE1 |      COL1       |
+---------+--------+-----------------+
|     120 | Y      | PROD_NAME_REUSE |
|     120 | N      | PROD_CAT_REUSE  |
+---------+--------+-----------------+

我的问题是使用UNPIVOT,是否有可能达到以下结果? 即prod_name_transfer是另一列,应该显示为value2。 UNPIVOT是否支持多个FOR..IN语句?

+---------+--------+-----------------+--------+---------------------+
| PROD_ID | VALUE1 |      COL1       |VALUE2 |      COL2            |
+---------+--------+-----------------+--------+---------------------+
|     120 | Y      | PROD_NAME_REUSE | Y      | PROD_NAME_TRANSFER  |
|     120 | N      | PROD_CAT_REUSE  | N      | PROD_NAME_TRANSFER  |
+---------+--------+-----------------+------------------------------+

Test table and data

我的实际表格大约有54列,有很多记录。

表格结构

CREATE TABLE test_unpivot2
(
   prod_id              NUMBER,
   prod_name_reuse      VARCHAR2 (1),
   prod_cat_reuse       VARCHAR2 (1),
   prod_name_transfer   VARCHAR2 (1),
   prod_cat_transfer    VARCHAR2 (1),
   remarks              VARCHAR2 (10)
);

表格数据

INSERT INTO test_unpivot2
     VALUES (120,
             'Y',
             'N',
             'Y',
             'N',
             'Test1');

INSERT INTO test_unpivot2
     VALUES (121,
             'Y',
             'N',
             'Y',
             'N',
             'Test2');

INSERT INTO test_unpivot2
     VALUES (122,
             'Y',
             'N',
             'Y',
             'N',
             'Test3');

INSERT INTO test_unpivot2
     VALUES (123,
             'Y',
             'N',
             'Y',
             'N',
             'Test4');

COMMIT

1 个答案:

答案 0 :(得分:1)

您甚至需要使用UNPIVOT吗?

SELECT id,
       prod_name_reuse      AS value1,
       'PROD_NAME_REUSE'    AS col1,
       prod_name_transfer   AS value2,
       'PROD_NAME_TRANSFER' AS col2
FROM   test_unpivot
WHERE  id = 120
UNION ALL
SELECT id,
       prod_cat_reuse      AS value1,
       'PROD_CAT_REUSE'    AS col1,
       prod_cat_transfer   AS value2,
       'PROD_CAT_TRANSFER' AS col2
FROM   test_unpivot
WHERE  id = 120;

<强>更新

SELECT *
FROM   (
  SELECT u.*,
         REGEXP_SUBSTR( type, '_(.+?)_', 1, 1, NULL, 1 ) AS namecat,
         REGEXP_SUBSTR( type, '[^_]+$' ) AS reusetransfer
  FROM   testunpivot
  UNPIVOT (
    value
    FOR type IN (
      prod_name_reuse,
      prod_cat_reuse,
      prod_name_transfer,
      prod_cat_transfer
    )
  ) u
)
PIVOT (
  MAX( value ) AS value,
  MAX( type  ) AS col
  FOR reusetransfer IN ( 'REUSE', 'TRANSFER' )
);