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

Откуда: Норильск
Сообщений: 932
Всем доброго дня. Помогите правильно написать условие для запроса.
Есть таблица, в ней 2 поля:

code vyvod
А.1 NULL
Г.3.1 2015-04-08 14:36:00
Г.3.2 2015-04-08 14:36:00
Б.8.1 2015-04-08 14:42:00
Г.3.1 NULL
Г.3.1 2015-04-05 15:36:00
Г.3.2 NULL


Надо сделать такую выборку: если по одному коду две или более записи (в примере Г.3.1), то берем код, где vyvod is null, а если код уникальный (т.е. 2 такого нет, в примере А.1, Б.8.1), то берем его без условия на поле vyvod.

Скрипт для таблицы:

DECLARE @t TABLE (code VARCHAR(50), vyvod SMALLDATETIME)
INSERT INTO @t
SELECT 'А.1',	NULL
UNION all
SELECT 'Г.3.1',	'2015-04-08 14:36:00'
UNION all
SELECT 'Г.3.2',	'2015-04-08 14:36:00'
UNION all
SELECT 'Б.8.1',	'2015-04-08 14:42:00'
UNION all
SELECT 'Г.3.1',	NULL
UNION all
SELECT 'Г.3.1',	'2015-04-05 15:36:00'
UNION all
SELECT 'Г.3.2',	NULL
SELECT * FROM @t
8 апр 15, 13:19    [17488121]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
Glory
Member

Откуда:
Сообщений: 104760
Настенька
то берем код,

Берем - это вы про поле или про всю запись ?
8 апр 15, 13:21    [17488135]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
Настенька,

SELECT  *
FROM    ( SELECT    * ,
                    ROW_NUMBER() OVER ( PARTITION BY code ORDER BY vyvod ) cnt
          FROM      @t
        ) ss
WHERE   cnt = 1
8 апр 15, 13:27    [17488173]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Как вариант,

SELECT *
FROM (
	SELECT *, cnt = COUNT(*) OVER (PARTITION BY code)
	FROM @t
) t
WHERE t.cnt = 1 OR t.vyvod IS NULL
8 апр 15, 13:29    [17488191]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
а что выбирать, если есть две записи с одним code, но в поле vyvod значения не null?
8 апр 15, 13:29    [17488192]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 932
Извините, пож-та, забыла указатьт, SQL Server 2000.

автор
а что выбирать, если есть две записи с одним code, но в поле vyvod значения не null?


Такого не может быть, если более одной записи, то обязательно есть запись с непустым полем vyvod.
8 апр 15, 13:34    [17488238]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
Glory
Member

Откуда:
Сообщений: 104760
Настенька
Такого не может быть, если более одной записи, то обязательно есть запись с непустым полем vyvod.

Какой результат должен получиться для приведенных выше данных ?
8 апр 15, 13:35    [17488247]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
SELECT  code ,
        vyvod
FROM    @t
WHERE   vyvod IS NULL
UNION ALL
SELECT  code ,
        vyvod
FROM    @t
WHERE   code NOT IN ( SELECT    code
                      FROM      @t
                      WHERE     vyvod IS NULL )
ORDER BY 1 ,
        2
8 апр 15, 13:39    [17488278]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Настенька
Извините, пож-та, забыла указатьт, SQL Server 2000
SELECT DISTINCT code, vyvod=(SELECT TOP 1 TT.vyvod FROM @t TT WHERE TT.code=T.code ORDER BY TT.vyvod) FROM @t T;
8 апр 15, 13:41    [17488293]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
гр к
Guest
SELECT t1.* 
FROM	@t t1 
join	(select code, count(code) qty from @t group by code) t2 on t1.code = t2.code
where (t2.qty > 1 and t1.vyvod is  null) or t2.qty=1
8 апр 15, 13:50    [17488355]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
Jaffar
Member

Откуда:
Сообщений: 633
--- если code уникальный то берем vyvod иначе берем NULL
select 
t.code,
case when count(1) = 1 then max(t.vyvod) end vyvod
from @t t
group by t.code
8 апр 15, 14:59    [17489038]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на 2 условия  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 932
Всем спасибо огромное, все получилось. Хорошего вам дня и отличного настроения.
9 апр 15, 06:26    [17491657]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить