使用CASE的具体情况 - 我如何

问题描述:

试图找到下列情况下适当的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

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

试试这个使用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