2013-02-11 58 views
0

試圖找到下列情況下適當的SQL:使用CASE的具體情況 - 我如何

假設我們有兩個表:一個名爲「ID」

TABLE A 
ID int, 
TEXT varchar(200) 

TABLE B 
ID int, 
A_NO int, 
B_NO int 

場都上表可以連接到鏈接表。

下面的SQL:

SELECT 
A.ID, 
B.A_NO, 
B.B_NO 
FROM 
A 
LEFT JOIN 
B 
ON A.ID = B.ID 
ORDER BY A.ID, B.A_NO, B.B_NO 

得出以下結果:現在

enter image description here

,問題。 要求的是,在列B_NO中,列A_NO的MIN值的值爲1,而具有相同A_NO值的所有其他行的值爲0。 下面的結果預計:

enter image description here

請注意,在這個例子中,我們可以發現兩行各B_NO價值,但有可能有超過2行。

我試圖通過使用CASE重現這些結果,但沒有成功。 感謝您提前幫忙, Bouzouki。

+0

這聽起來像一個家庭作業或學習作業。你有什麼嘗試?而且,你在用什麼數據庫? – 2013-02-11 20:38:57

+0

不,不是功課(但我希望!!!)。我成功地獲得了結果,但是我直接在CASE中使用了一個具有很長子查詢的CASE。即使那樣,它只是一個特定的ID。由於我真的不是SQL專家,因此我有一些問題需要了解如何使用條件語句來填充字段B_NO。 – Bouzouki 2013-02-11 20:43:23

+0

而且,我正在使用SQ Server 2008 R2。 – Bouzouki 2013-02-11 20:43:53

回答

1

select ID, a_no, b_no, 
      case when a_no = min_a_no then b_no else 0 end as new_b_no 
    from 
      a left join b on a.id = b.id left join 
      (Select ID, B_no, min(a_no) as min_a_no 
      from a left join b on a.id = b.id 
      group by id, b_no) m on a.id = m.id and b.b_no = m.b_no 
    ORDER BY A.ID, B.A_NO 
+0

非常感謝您的明確SQL。它完美的作品。卡夫也提出了一個很好的答案,但對於沒有經驗的程序員來說,你的答案是最易讀的。我希望這會幫助有類似情況的人。 – Bouzouki 2013-02-11 21:49:38

2

試試這個使用CTEROW_NUMBER(); (DEMO

請注意:我已經考慮myT爲您加盟AB表用於演示目的的查詢。所以請用A LEFT JOIN B ON A.ID = B.ID代替myT

;with cte as (
    select id, a_no, b_no, 
     row_number() over(partition by id,b_no order by a_no) rn 
    from myT 
) 
select id,a_no, case when rn=1 then b_no else 0 end b_no 
from cte 
order by a_no 

--RESULTS FROM DEMO TABLE 
|  ID | A_NO | B_NO | 
------------------------- 
| 1031014 | 1 | 1 | 
| 1031014 | 2 | 0 | 
| 1031014 | 3 | 2 | 
| 1031014 | 4 | 0 | 
| 1031014 | 5 | 3 | 
| 1031014 | 6 | 0 | 
| 1031014 | 7 | 4 | 
| 1031014 | 8 | 0 | 
| 1031014 | 9 | 5 | 
| 1031014 | 10 | 0 | 
+0

謝謝卡夫。它也可以很好地工作。 Beth的答案對我們來說可能是最容易管理的。但我從你的答案中學習。再次感謝。 – Bouzouki 2013-02-11 21:52:09

+0

@Bouzouki:沒問題。只要你的工作完成了! – Kaf 2013-02-11 22:00:19