2017-05-23 30 views
0

我有下面的表结构列具有多个逆透视或对于

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 
+0

你可以添加,让你的实际/预期产出的问题示例数据(而不是在场外链接)? – MT0

+0

@ MT0我在问题中包含了表结构和数据。 – user75ponic

回答

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') 
); 
+0

正如我在问题中提到的,在我的实际表格中,我有54列,我更喜欢使用UNPIVOT。 – user75ponic

+0

我忘了提及,UNION ALL对我来说不是一种选择。 – user75ponic

+0

@ user75ponic更新 – MT0