2013-10-29 22 views
0

我有以下結構的表:選擇適當的值作爲列標題

ID KEY  VALUE SEQ 
1 Amount 5  2 
1 Amount 4  1 
1 Type T1  2 
1 Type T1  1 
2 Amount 10  2 
2 Amount 5  1 
2 Type T2  2 
2 Type T2  1 

我想創建一個查詢來獲取這樣的:

ID Amount Type 
1 5  T1 
2 10  T2 

正如你可以看到有可能是(ID,Key)的多種組合,但(ID,Key,Seq)是唯一的。

SELECT T.ID, 
     T1.VALUE as Amount, 
     T2.VALUE as Type 
FROM 
    (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T 
    JOIN 
     TABLE as T1 
      ON T1.ID = T.ID 
      AND T1.KEY = 'Amount' 
      AND T1.SEQ = MAXSEQ 
    JOIN 
     TABLE as T2 
      ON T2.ID = T.ID 
      AND T2.KEY = 'Type' 
      AND T2.SEQ = MAXSEQ 

但我得到的是我沒想到

ID Amount Type 

    1 5  T1 
    1 4  T1 
    1 10  T1 
    1 5  T1 
    2 10  T2 
    2 5  T2 
    2 4  T2 
    2 5  T2 

我已經看過這個帖子的結果,但儘管它有助於here

任何想法,它並不適用於我的情況誰來解決這個問題?

+1

我想得到理想的結果。 http://sqlfiddle.com/#!3/f3e87/1我在做什麼? – Andrew

+0

感謝您的評論安德魯..您正在使用您的示例sql服務器。我使用oracle – locorecto

回答

0

the linked question中缺少的內容是DISTINCT關鍵字。

另請參閱下面的說明the query posted by ypercube。事實上,你正在重複,因爲你正在加入一個表格。因此,行將被鏡像。

你的子查詢應該是:

(SELECT DISTINCT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T 
+0

不是真的。通過id分組,我將得到與DISTINCT相同的效果。 – locorecto

1
SELECT 
    id, amount, type 
FROM TABLE1 
    natural join (SELECT ID, MAX(SEQ) as SEQ FROM TABLE1 GROUP BY ID) 
pivot (
    max(VALUE) for key in ('Amount' as amount, 'Type' as type) 
) 

fiddle

0

我意識到有另一列,我沒有把在問題(避免給人出真正的數據)影響了結果。唯一的約束是(ID,Key,Seq,Time)而不是(ID,Key,Seq)。作爲@Andrew提到查詢返回正確的結果。

這裏去查詢再次

SELECT T.ID, 
     T1.VALUE as Amount, 
     T2.VALUE as Type 
FROM 
    (SELECT ID, MAX(SEQ) as MAXSEQ FROM TABLE GROUP BY ID) as T 
    JOIN 
     TABLE as T1 
      ON T1.ID = T.ID 
      AND T1.KEY = 'Amount' 
      AND T1.SEQ = MAXSEQ 
    JOIN 
     TABLE as T2 
      ON T2.ID = T.ID 
      AND T2.KEY = 'Type' 
      AND T2.SEQ = MAXSEQ 

感謝安德魯的澄清和sqlfiddle。如果我浪費了任何人的時間,我很抱歉。