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

Откуда: Киев
Сообщений: 35
Ситуация:
Есть таблица, содержащая Идентификатор, телефон, Статус (цифра от 0 до 6). В рамках одного ИД может быть несколько телефонов. Как выбрать ИД, где по всем телефонам Статус = 3.
Вроде просто, но разобраться не могу.
Заранее благодарен за ответ
5 дек 19, 11:09    [22032879]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
1C Developer
Member

Откуда:
Сообщений: 65
DECLARE @T TABLE (id int, phone NVARCHAR(20), Status int)

INSERT INTO @T(id, phone, Status)
SELECT 1, '111', 3 UNION ALL
SELECT 1, '112', 3 UNION ALL
SELECT 2, '113', 3 UNION ALL
SELECT 2, '114', 4 UNION ALL
SELECT 3, '114', 3 UNION ALL
SELECT 4, '115', 5

SELECT T.id
FROM @T T
GROUP BY T.id 
HAVING 
        SUM(CASE WHEN T.Status = 3
        THEN 1 ELSE 0 END) > 0 
	AND SUM(
        CASE WHEN T.Status != 3
        THEN 1 ELSE 0 END) = 0 


Сообщение было отредактировано: 5 дек 19, 11:20
5 дек 19, 11:19    [22032901]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
select Идентификатор from [Есть таблица] where Статус = 3
except
select Идентификатор from [Есть таблица] where Статус <> 3;
5 дек 19, 11:38    [22032936]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20207
1C Developer
HAVING 
        SUM(CASE WHEN T.Status = 3
        THEN 1 ELSE 0 END) > 0 
	AND SUM(
        CASE WHEN T.Status != 3
        THEN 1 ELSE 0 END) = 0 

А не проще
HAVING SUM(CASE WHEN T.Status = 3 THEN 0 ELSE 1 END) = 0
5 дек 19, 11:40    [22032939]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
entrypoint
Member

Откуда:
Сообщений: 227
Patucho,

DECLARE @t TABLE (id INT, phone VARCHAR(20), [Status] INT)

INSERT INTO @t(id, phone, [Status])
SELECT 1, '111', 3 UNION ALL
SELECT 1, '112', 3 UNION ALL
SELECT 2, '113', 3 UNION ALL
SELECT 2, '114', 4 UNION ALL
SELECT 3, '114', 3 UNION ALL
SELECT 4, '115', 5

SELECT DISTINCT t.id
FROM @t AS t
WHERE 3 = ALL(SELECT q.[Status] FROM @t AS q WHERE q.id = t.id);
24 дек 19, 15:38    [22047842]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4381
DECLARE @t TABLE (id INT, phone VARCHAR(20), [Status] INT);

INSERT INTO @t(id, phone, [Status])
SELECT 1, '111', 3 UNION ALL
SELECT 1, '112', 3 UNION ALL
SELECT 2, '113', 3 UNION ALL
SELECT 2, '114', 4 UNION ALL
SELECT 3, '114', 3 UNION ALL
SELECT 4, '115', 5;

SELECT * FROM 
(
	SELECT 
		Id, 
		MinS = Min(Status) OVER (PARTITION BY ID), 
		MaxS = Max(Status) OVER (PARTITION BY ID)
	FROM @t
) a
WHERE MinS = 3 AND MaxS = 3


Сообщение было отредактировано: 24 дек 19, 17:12
24 дек 19, 17:10    [22047919]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3145
Patucho,

select *
from @t t
where not exists (
  select 0 from @t x where x.Id = t.Id and x.Status != 3
);
24 дек 19, 17:44    [22047961]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
aleks222
Member

Откуда:
Сообщений: 855
Akina
1C Developer
HAVING 
        SUM(CASE WHEN T.Status = 3
        THEN 1 ELSE 0 END) > 0 
	AND SUM(
        CASE WHEN T.Status != 3
        THEN 1 ELSE 0 END) = 0 

А не проще
HAVING SUM(CASE WHEN T.Status = 3 THEN 0 ELSE 1 END) = 0

Группировка - это зло.
Ненужная группировка - большое зло.

select * 
  from [Есть таблица] as t
  where Статус = 3 and not exists( select * from [Есть таблица] as tt where tt.Идентификатор = t.Идентификатор and  Статус <> 3 )
24 дек 19, 19:41    [22048023]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
entrypoint
Member

Откуда:
Сообщений: 227
a_voronin,

От эстета - эстету

DECLARE @t TABLE (id INT, phone VARCHAR(20), [Status] INT);

INSERT INTO @t(id, phone, [Status])
SELECT 1, '111', 3 UNION ALL
SELECT 1, '112', 3 UNION ALL
SELECT 2, '113', 3 UNION ALL
SELECT 2, '114', 4 UNION ALL
SELECT 3, '114', 3 UNION ALL
SELECT 4, '115', 5;

SELECT Id FROM @t
GROUP BY id
HAVING COUNT(DISTINCT [Status]) = 1 AND MAX([Status]) = 3
25 дек 19, 10:27    [22048233]     Ответить | Цитировать Сообщить модератору
 Re: Выбор строк по критерию  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
aleks222
Ненужная группировка - большое зло.
Нужны уникальные ID. Так что придется написать select distinct, что и даст группировку (или Distinct Sort).
И получишь ты в итоге более длинную запись вот этого - 22032936
25 дек 19, 10:48    [22048247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить