2015-06-17 97 views
0

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

回答

0
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依賴的。

+0

我不打算使用1 2 3,它們只是現在的示例名稱。我會把我的真實列名放在我的尾端:) 有沒有辦法更一般地做到這一點?從Sys cols獲取列名?我必須將每一個硬編碼爲工會聲明......? – LaurAchnid

+0

這聽起來像是一個新問題。在這個問題中,我(或者具有我的一般知識水平的回答者)需要知道您正在使用哪個RDBMS,並查看您希望推廣過程的多個實例的示例。 –

+0

也可能是相關的,無論你是純粹的SQL還是可以爲你的項目使用過程語言(PL/SQL,TSQL等)。 –

0

雖然我不認爲這是一個可行的答案,但它可能會給你一些想法,因爲它會在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 

不完全是我所謂的「生產準備」。