2013-02-11 4 views
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 

дает следующие результаты:

enter image description here

Теперь проблема. Требуется, чтобы в столбце B_NO значение = 1 для значения MIN столбца A_NO и значения = 0 для всех остальных строк с тем же значением A_NO. Приведенные ниже результаты ожидаются:

enter image description here

Пожалуйста, обратите внимание, что в этом примере, мы можем найти две строки для каждого значения B_NO но ​​можно иметь более 2-х строк.

Я попытался воспроизвести эти результаты с помощью CASE, но без успеха. Спасибо за помощь, Bouzouki.

+0

Это звучит как домашнее задание или учебное задание. Что вы пробовали? И какая база данных вы используете? –

+0

Нет, не домашняя работа (но я хочу !!!). Я успешно получаю результаты, но я использую CASE с очень длинным подзапросом непосредственно в CASE. Даже тогда это было только для определенного идентификатора. Поскольку я действительно не специалист по SQL, у меня есть некоторые проблемы, чтобы увидеть, как я могу использовать условный оператор для заполнения поля B_NO. – Bouzouki

+0

И я использую SQ Server 2008 R2. – Bouzouki

ответ

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. Он работает отлично. Kaf также дал хороший ответ, но ваш ответ наиболее читабельен для неопытного программиста. Надеюсь, что это поможет людям с подобной ситуацией. – Bouzouki

2

Попробуйте это с помощью CTE и ROW_NUMBER(); (DEMO)

Пожалуйста, обратите внимание: Я рассмотрел myT, как ваш присоединился запрос из AиB таблиц для демо-целей. Таким образом, замените myT с вашим A 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 | 
+0

Спасибо Kaf. Он отлично работает. Ответ Бет, вероятно, проще всего для нас. Но я узнаю из вашего ответа. Еще раз спасибо. – Bouzouki

+0

@Bouzouki: Нет проблем. Пока твоя работа! – Kaf

Смежные вопросы