Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор строк по критерию / 10 сообщений из 10, страница 1 из 1
05.12.2019, 11:09
    #39898465
Patucho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Ситуация:
Есть таблица, содержащая Идентификатор, телефон, Статус (цифра от 0 до 6). В рамках одного ИД может быть несколько телефонов. Как выбрать ИД, где по всем телефонам Статус = 3.
Вроде просто, но разобраться не могу.
Заранее благодарен за ответ
...
Рейтинг: 0 / 0
05.12.2019, 11:19
    #39898476
1C Developer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 
...
Рейтинг: 0 / 0
05.12.2019, 11:38
    #39898488
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Код: sql
1.
2.
3.
select Идентификатор from [Есть таблица] where Статус = 3
except
select Идентификатор from [Есть таблица] where Статус <> 3;
...
Рейтинг: 0 / 0
05.12.2019, 11:40
    #39898490
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
1C Developer
Код: sql
1.
2.
3.
4.
5.
6.
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 


А не проще
Код: sql
1.
HAVING SUM(CASE WHEN T.Status = 3 THEN 0 ELSE 1 END) = 0
...
Рейтинг: 0 / 0
24.12.2019, 15:38
    #39907534
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Patucho,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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);
...
Рейтинг: 0 / 0
24.12.2019, 17:10
    #39907579
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
24.12.2019, 17:44
    #39907609
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Patucho,

Код: sql
1.
2.
3.
4.
5.
select *
from @t t
where not exists (
  select 0 from @t x where x.Id = t.Id and x.Status != 3
);
...
Рейтинг: 0 / 0
24.12.2019, 19:41
    #39907646
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
Akina
1C Developer
Код: sql
1.
2.
3.
4.
5.
6.
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 


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


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

Код: sql
1.
2.
3.
select * 
  from [Есть таблица] as t
  where Статус = 3 and not exists( select * from [Есть таблица] as tt where tt.Идентификатор = t.Идентификатор and  Статус <> 3 )
...
Рейтинг: 0 / 0
25.12.2019, 10:27
    #39907758
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
a_voronin,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
25.12.2019, 10:48
    #39907767
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строк по критерию
aleks222
Ненужная группировка - большое зло.
Нужны уникальные ID. Так что придется написать select distinct, что и даст группировку (или Distinct Sort).
И получишь ты в итоге более длинную запись вот этого - 22032936
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор строк по критерию / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]