2013-08-30 40 views
1

的條件在一列中顯示數據/另一列T-SQL顯示的條件在一列中的數據/另一列的數據

的數據我期待從行選擇數據和在一列中顯示它們取決於相鄰列中的數據 。

實施例:

這是我的數據:

ID   STATUS  VALUE 
XYZ   1   7.50 
XYZ   2   65.00 
XYZ   3   795.00 
ABC   1   15.60 
ABC   3   563.50 
ABC   2   79.00 
DEF   3   597.00 
DEF   1   23.00 
DEF   2   89.60 

我尋找的結果是:

(1 =值a,2 = VALUEB,3 = ValueC)

ID   VALUEA  VALUEB  VALUEC 
XYZ   7.50  65.00  795.00 
ABC   15.60  79.00  563.50 
DEF   23.00  89.60  597.00 

我在本網站上發現了處理類似問題的條目,但不太適合這種情況。有沒有一個簡單的查詢會產生所需的結果?

回答

2

您應該能夠使用聚合函數CASE表達式得到結果:

select id, 
    max(case when status = 1 then value end) ValueA, 
    max(case when status = 2 then value end) ValueB, 
    max(case when status = 3 then value end) ValueC 
from yourtable 
group by id; 

SQL Fiddle with Demo。 CASE表達式將檢查每個status,然後選擇相關的最大值。數據從行到列的轉換被稱爲PIVOT。

您也可以使用PIVOT函數來得到結果:

select id, 
    [1] ValueA, 
    [2] ValueB, 
    [3] ValueC 
from yourtable 
pivot 
(
    max(value) 
    for status in ([1], [2], [3]) 
) piv; 

SQL Fiddle with Demo

最後,您還可以多次參加關於你的表格返回結果:

select a.id, 
    a.value ValueA, 
    b.value ValueB, 
    c.value ValueC 
from yourtable a 
left join yourtable b 
    on a.id = b.id 
    and b.status = 2 
left join yourtable c 
    on a.id = c.id 
    and c.status = 3 
where a.status = 1; 

SQL Fiddle with Demo

1

您正在尋找透視數據。要做到這一點的方法之一是通過有條件max()使用聚合:

SELECT id , 
    MAX(CASE WHEN status = 1 THEN Value 
     END) AS ValueA , 
    MAX(CASE WHEN status = 2 THEN Value 
     END) AS ValueB , 
    MAX(CASE WHEN status = 3 THEN Value 
     END) AS ValueC 
FROM t 
GROUP BY id; 
0

你似乎是在尋找PIVOT聲明。

相關問題