使用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
得出以下结果:现在
,问题。 要求的是,在列B_NO中,列A_NO的MIN值的值为1,而具有相同A_NO值的所有其他行的值为0。 下面的结果预计:
请注意,在这个例子中,我们可以发现两行各B_NO价值,但有可能有超过2行。
我试图通过使用CASE重现这些结果,但没有成功。 感谢您提前帮忙, Bouzouki。
答
像
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
答
试试这个使用CTE
和ROW_NUMBER()
; (DEMO)
请注意:我已经考虑myT
为您加盟A
和B
表用于演示目的的查询。所以请用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 |
这听起来像一个家庭作业或学习作业。你有什么尝试?而且,你在用什么数据库? – 2013-02-11 20:38:57
不,不是功课(但我希望!!!)。我成功地获得了结果,但是我直接在CASE中使用了一个具有很长子查询的CASE。即使那样,它只是一个特定的ID。由于我真的不是SQL专家,因此我有一些问题需要了解如何使用条件语句来填充字段B_NO。 – Bouzouki 2013-02-11 20:43:23
而且,我正在使用SQ Server 2008 R2。 – Bouzouki 2013-02-11 20:43:53