Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать следующий запрос?  [new]
_unkind_
Member

Откуда:
Сообщений: 340
например такой запрос
select col1, col2 from table1 inner join table2 on table1.col1 = table2.col1

на выходе он выдает результат
col1 col2
a 10
a 10
a 10
b 20
b 20
b 20

как сделать так что бы он выдавал col2 только одной записи в col1?
col1 col2
a 10
a 0
a 0
b 20
b 0
b 0
25 май 11, 16:18    [10707876]     Ответить | Цитировать Сообщить модератору
 Re: Как написать следующий запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
select col1, CASE ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY(SELECT 0)) WHEN 1 THEN col2 ELSE 0 END col2
from table1
join table2 on table1.col1 = table2.col1;
25 май 11, 16:26    [10707977]     Ответить | Цитировать Сообщить модератору
 Re: Как написать следующий запрос?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
_unkind_
на выходе он выдает результат
Неправда, на выходе он выдает ошибку "Ambigious column name: col1".

А вообще, как-то так:
select sq.Col1, case when sq.RN = 1 then sq.Col2 else 0 end as [Col2]
from (
	select t1.Col1, t2.Col2, row_number() over(partition by t1.Col1) as [RN]
	from table1 t1
		inner join table2 t2 on t1.col1 = t2.col1
	) sq;
Версия >= 2005.
25 май 11, 16:28    [10707996]     Ответить | Цитировать Сообщить модератору
 Re: Как написать следующий запрос?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ennor Tiegael
_unkind_
на выходе он выдает результат
Неправда, на выходе он выдает ошибку "Ambigious column name: col1".

А вообще, как-то так:
select sq.Col1, case when sq.RN = 1 then sq.Col2 else 0 end as [Col2]
from (
	select t1.Col1, t2.Col2, row_number() over(partition by t1.Col1) as [RN]
	from table1 t1
		inner join table2 t2 on t1.col1 = t2.col1
	) sq;
Версия >= 2005.
Неправда, row_number() не может быть без order by!

Ну, и я лопухнулся с алиасами, конечно...
25 май 11, 16:31    [10708036]     Ответить | Цитировать Сообщить модератору
 Re: Как написать следующий запрос?  [new]
_unkind_
Member

Откуда:
Сообщений: 340
iap
select col1, CASE ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY(SELECT 0)) WHEN 1 THEN col2 ELSE 0 END col2
from table1
join table2 on table1.col1 = table2.col1;


Спасибо огромное, все отлично работает.
25 май 11, 16:42    [10708159]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить