2017-05-23 28 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