powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор строк по критерию
10 сообщений из 10, страница 1 из 1
Выбор строк по критерию
    #39898465
Patucho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация:
Есть таблица, содержащая Идентификатор, телефон, Статус (цифра от 0 до 6). В рамках одного ИД может быть несколько телефонов. Как выбрать ИД, где по всем телефонам Статус = 3.
Вроде просто, но разобраться не могу.
Заранее благодарен за ответ
...
Рейтинг: 0 / 0
Выбор строк по критерию
    #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
Выбор строк по критерию
    #39898488
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select Идентификатор from [Есть таблица] where Статус = 3
except
select Идентификатор from [Есть таблица] where Статус <> 3;
...
Рейтинг: 0 / 0
Выбор строк по критерию
    #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
Выбор строк по критерию
    #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
Выбор строк по критерию
    #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
Выбор строк по критерию
    #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
Выбор строк по критерию
    #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
Выбор строк по критерию
    #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
Выбор строк по критерию
    #39907767
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ненужная группировка - большое зло.
Нужны уникальные ID. Так что придется написать select distinct, что и даст группировку (или Distinct Sort).
И получишь ты в итоге более длинную запись вот этого - 22032936
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбор строк по критерию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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