0

我正在尝试为以下情况找到合适的 SQL:

假设我们有两个表:

TABLE A
ID int,
TEXT varchar(200)

TABLE B
ID int,
A_NO int,
B_NO int

两个表上名为“ID”的字段可以连接到链接表。

下面的 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 来重现这些结果,但没有成功。提前感谢您的帮助,布祖基。

4

2 回答 2

2

尝试使用CTEand ROW_NUMBER(); (演示

请注意:出于演示目的,我已将您的查询和表格视为您myT联合查询。所以替换为 as yours 。A BmyTA LEFT JOIN B ON A.ID = B.ID

;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-11T20:54:03.683 回答
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
于 2013-02-11T20:52:33.947 回答