我有一個表,其中的資料與原始資料相似。通過使用原始資料,我想使用 SQL 中的 PIVOT 或 UNPIVOT 重構為修改后的資料,例如表中的資料。
原始資料
| 很多 | 表格1 | 表2 | 表3 | 表4 | ... | 表28 | 頭號 | … |
|---|---|---|---|---|---|---|---|---|
| 一種 | xxa | xxb | xxc | xxd | ... | xxf | 1 | … |
| 乙 | xxg | xxe | 二十一 | xxp | ... | xxx | 1 | … |
| C | xxk | xxm | xxr | xxt | ... | 許 | 4 | … |
| … | ... | ... | ... | ... | ... | ... | … | … |
修改后的結果
| 很多 | 桌子 | 表號 | 頭不 | … |
|---|---|---|---|---|
| 一種 | xxa | 表格1 | 1 | … |
| 一種 | xxb | 表2 | 1 | … |
| 一種 | xxc | 表3 | 1 | … |
| 一種 | xxd | 表4 | 1 | … |
| 一種 | ... | …… | … | … |
| 乙 | xxg | 表格1 | 1 | … |
| 乙 | xxe | 表2 | 1 | … |
| 乙 | 二十一 | 表3 | 1 | … |
| 乙 | xxp | 表4 | 1 | … |
| 乙 | ... | … | … | … |
| C | xxk | 表格1 | 4 | … |
| … | … | … | … | … |
提前致謝。
原始資料和修改資料
原始資料和修改資料 更新版本
uj5u.com熱心網友回復:
我的逆透視技術是遵守通用 SQL 標準(不限于在特定資料庫上運行的標準)。
在這種情況下,取消旋轉是關于將“水平”表與一個行內表交叉連接,該行內表i由整數列i和與要旋轉的水平列一樣多的連續整陣列成 - 以及一個 CASE WHEN 運算式根據i當前結果集中的當前值使用右列:
WITH
-- your input - 5 columns work the same as 28 ...
-- do not use in your real query.
indata(lot,table1,table2,table3,table4,table5,headno) AS (
SELECT 'a','xxa','xxb','xxc','xxd','xxf',1 FROM dual
UNION ALL SELECT 'b','xxg','xxe','xxi','xxp','xxx',1 FROM dual
UNION ALL SELECT 'c','xxk','xxm','xxr','xxt','xxu',4 FROM dual
)
-- real query starts here, replace following comma with "WITH"
,
-- need series of integers - 28 rather than 5 in the full example ..
i(i) AS (
SELECT 1 FROM dual
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
)
SELECT
lot
, CASE i
WHEN 1 THEN table1
WHEN 2 THEN table2
WHEN 3 THEN table3
WHEN 4 THEN table4
WHEN 5 THEN table5
ELSE NULL
END AS tbl
, 'table'||CAST(i AS VARCHAR(1)) AS table_NO
, headno
FROM indata CROSS JOIN i
ORDER BY lot,i
-- out lot | tbl | table_NO | headno
-- out ----- ----- ---------- --------
-- out a | xxa | table1 | 1
-- out a | xxb | table2 | 1
-- out a | xxc | table3 | 1
-- out a | xxd | table4 | 1
-- out a | xxf | table5 | 1
-- out b | xxg | table1 | 1
-- out b | xxe | table2 | 1
-- out b | xxi | table3 | 1
-- out b | xxp | table4 | 1
-- out b | xxx | table5 | 1
-- out c | xxk | table1 | 4
-- out c | xxm | table2 | 4
-- out c | xxr | table3 | 4
-- out c | xxt | table4 | 4
-- out c | xxu | table5 | 4
uj5u.com熱心網友回復:
你需要UNPIVOT:
SELECT lot,
"TABLE",
tableno,
headno
/*,...*/
FROM table_name
UNPIVOT (
"TABLE" FOR tableno IN (
table1, table2, table3, table4, /*...,*/ table28
)
)
其中,對于樣本資料:
CREATE TABLE table_name (lot, table1, table2, table3, table4, /*...,*/ table28, headno /*,...*/ ) AS
SELECT 'a', 'xxa', 'xxb', 'xxc', 'xxd', /*...,*/ 'xxf', 1 /*,...*/ FROM DUAL UNION ALL
SELECT 'b', 'xxg', 'xxe', 'xxi', 'xxp', /*...,*/ 'xxx', 1 /*,...*/ FROM DUAL UNION ALL
SELECT 'c', 'xxk', 'xxm', 'xxr', 'xxt', /*...,*/ 'xxu', 4 /*,...*/ FROM DUAL;
輸出:
很多 桌子 桌諾 海德諾 一種 xxa 表格1 1 一種 xxb 表2 1 一種 xxc 表3 1 一種 xxd 表4 1 一種 xxf 表28 1 乙 xxg 表格1 1 乙 xxe 表2 1 乙 二十一 表3 1 乙 xxp 表4 1 乙 xxx 表28 1 C xxk 表格1 4 C xxm 表2 4 C xxr 表3 4 C xxt 表4 4 C 許 表28 4
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376675.html
上一篇:如何在Oracle中獲得唯一值
