SQL表如果我有一個表具有以下結構轉化使用逆透視
ID NAME A1 A2 A3 B1 B2 B3
X ----ÿ------ 0- --1 --- 2 --- --- 3 --- 4 5(破折號只是推值下標頭)
如何轉變它是以下內容:
ID NAME LETTER 1 2 3
X ----ý---------- ------甲0-1-2
X --- ----------ÿ --B ----- 3-4-5
SQL表如果我有一個表具有以下結構轉化使用逆透視
ID NAME A1 A2 A3 B1 B2 B3
X ----ÿ------ 0- --1 --- 2 --- --- 3 --- 4 5(破折號只是推值下標頭)
如何轉變它是以下內容:
ID NAME LETTER 1 2 3
X ----ý---------- ------甲0-1-2
X --- ----------ÿ --B ----- 3-4-5
SELECT id, name, 'A' letter, a1 1, a2 2, a3 3 from example_table
UNION
SELECT id, name, 'B' letter, b1 1, b2 2, b3 3 from example_table
我不確定1,2,3
將作爲列名工作;這可能是RDBMS依賴的。
雖然我不認爲這是一個可行的答案,但它可能會給你一些想法,因爲它會在sql server中產生最終結果。
SELECT
upvt.id
, upvt.name
, left(label,1) AS letter
, CASE
WHEN left(label,1) = 'A' THEN MIN(value)
WHEN left(label,1) = 'B' THEN MAX(value)
END AS [1]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value1)
WHEN left(label,1) = 'B' THEN MAX(value1)
END AS [2]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value2)
WHEN left(label,1) = 'B' THEN MAX(value2)
END AS [3]
FROM example_table
UNPIVOT (
value
FOR label IN (a1,b1)
) upvt
INNER JOIN (
SELECT
id
, name
, left(label1,1) AS letter
, value1
FROM example_table
UNPIVOT (
value1
FOR label1 IN (a2,b2)
) upvt1) as b
ON upvt.id = b.id
AND upvt.name = b.name
INNER JOIN (
SELECT
id
, name
, left(label2,1) AS letter
, value2
FROM example_table
UNPIVOT (
value2
FOR label2 IN (a3,b3)
) upvt2) c
ON upvt.id = c.id
AND upvt.name = c.name
group by upvt.id, upvt.name, upvt.label
不完全是我所謂的「生產準備」。
我不打算使用1 2 3,它們只是現在的示例名稱。我會把我的真實列名放在我的尾端:) 有沒有辦法更一般地做到這一點?從Sys cols獲取列名?我必須將每一個硬編碼爲工會聲明......? – LaurAchnid
這聽起來像是一個新問題。在這個問題中,我(或者具有我的一般知識水平的回答者)需要知道您正在使用哪個RDBMS,並查看您希望推廣過程的多個實例的示例。 –
也可能是相關的,無論你是純粹的SQL還是可以爲你的項目使用過程語言(PL/SQL,TSQL等)。 –