Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом (ну ОЧЕНЬ нужно) / 10 сообщений из 10, страница 1 из 1
02.04.2002, 06:19
    #32026707
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
Помогите с запросом (ну ОЧЕНЬ нужно)
Есть таблица 'names'
(id[int], name[char], value[int])

0 Первый день обхода 0
0 Второй день обхода 0
0 Ежедневный обход 1
5 Первый день обхода 0
5 Второй день обхода 1
5 Ежедневный обход 0
1 Первый день обхода 1
1 Второй день обхода 1
1 Ежедневный обход 1
2 Первый день обхода 1
2 Второй день обхода 0
2 Ежедневный обход 0
2 Новый день обхода 1
0 Новый день обхода 0
1 Новый день обхода 0
4 Первый день обхода 1
4 Первый день обхода 0
4 Ежедневный обход 0
4 Новый день обхода 0

Вопрос:
Как выбрать только тот id у которого name = Первый день обхода и name = Первый день обхода
и в обоих случаях value = 1

Заранее благодарен.
...
Рейтинг: 0 / 0
02.04.2002, 06:27
    #32026710
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
---------------------------------------------------------------------
у которого name = Первый день обхода и name = Первый день обхода
и в обоих случаях value = 1
---------------------------------------------------------------------
Ты тут ничего не перепутал?
...
Рейтинг: 0 / 0
02.04.2002, 06:40
    #32026712
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
Действительно перепутал. Спасибо.
Корректный вопрос следующий

Вопрос:
Как выбрать только тот id у которого name = Первый день обхода и name = Второй день обхода
и в обоих случаях value = 1

Заранее благодарен.
...
Рейтинг: 0 / 0
02.04.2002, 08:13
    #32026734
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
select id
from names
where value = 1 AND name IN('Первый день обхода','Второй день обхода')
group by id having count(*) = 2

PS
Может несколько топорный вариант
...
Рейтинг: 0 / 0
02.04.2002, 08:36
    #32026739
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
Другой вариант:

SELECT id
FROM names
WHERE value = 1 AND name = 'Первый день обхода'
UNION
SELECT id
FROM names
WHERE value = 1 AND name = 'Второй день обхода'

Тут следует заметить, что использование UNION без опции ALL аналогично применению DISTINCT на результат выборки. Если необходимо включить и повторяющиеся значения, то необходимо писать UNION ALL
...
Рейтинг: 0 / 0
02.04.2002, 08:51
    #32026745
Костя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
/*create table names(id int, name nvarchar(50), value int)
insert names values (0, N'Первый день обхода', 0)
insert names values (0, N'Второй день обхода', 0)
insert names values (0, N'Ежедневный обход', 1)
insert names values (5, N'Первый день обхода', 0)
insert names values (5, N'Второй день обхода', 1)
insert names values (5, N'Ежедневный обход', 0)
insert names values (1, N'Первый день обхода', 1)
insert names values (1, N'Второй день обхода', 1)
insert names values (1, N'Ежедневный обход', 1)
insert names values (2, N'Первый день обхода', 1)
insert names values (2, N'Второй день обхода', 0)
insert names values (2, N'Ежедневный обход', 0)
insert names values (2, N'Новый день обхода', 1)
insert names values (0, N'Новый день обхода', 0)
insert names values (1, N'Новый день обхода', 0)
insert names values (4, N'Первый день обхода', 1)
insert names values (4, N'Первый день обхода', 0)
insert names values (4, N'Ежедневный обход', 0)
insert names values (4, N'Новый день обхода', 0)
*/

select a.id from
(
select
id
, max (case when name = N'Первый день обхода' then 1 else null end )as [Первый день обхода]
, max (case when name = N'Второй день обхода' then 1 else null end )as [Второй день обхода]
from names
where name in (N'Первый день обхода',N'Второй день обхода') and value = 1
group by id
)as a
where a.[Первый день обхода]=1 and a.[Второй день обхода]=1

Результат:
id
-----------
1
...
Рейтинг: 0 / 0
02.04.2002, 09:09
    #32026751
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
Извиняюсь, вариант с UNION не проходит, поскольку это аналогично использованию "ИЛИ", а тебе необходимо "И". Тогда так:

SELECT a.id
FROM names a INNER JOIN names b ON a.id=b.id
WHERE a.value = 1 AND a.name = 'Первый день обхода' AND b.value = 1 AND name = 'Второй день обхода'
...
Рейтинг: 0 / 0
02.04.2002, 09:47
    #32026755
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
IMHO так будет лучше (по крайней мере судя по плану выполнения) и правильнее (по сравнению с моим первым вариантом)

select id
from names
group by id having sum(case when name = N'Первый день обхода' and value = 1 then 1 else null end ) = 1
and sum(case when name = N'Второй день обхода' and value = 1 then 1 else null end ) = 1
...
Рейтинг: 0 / 0
02.04.2002, 10:11
    #32026758
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
2 Glory & Костя

Ну, лично я считаю, что правильнее (опять же судя по плану выполнения) мой вариант с JOIN. Хотя там не мешало бы добавить DISTINCT

Но вопрос не о том. Почему вы вместе с Костей в выражении суммирования складываете 1 и NULL. Ведь записей с таким текстом может быть несколько. Логичнее было бы писать SUM()>0. Но в этом случае Вы получите предупреждение о некорректном использовании NULL в операторе.

Т.е. почемы вы вместо NULL не пишете 0 ?
...
Рейтинг: 0 / 0
02.04.2002, 10:59
    #32026763
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (ну ОЧЕНЬ нужно)
А чё так сложно? А если тупо, в лоб?

select distinct id from names n where
exists(select * from names n1 where n.id=n1.id and n1.value=1 and n1.name=N'Первый день обхода')
and
exists(select * from names n2 where n.id=n2.id and n2.value=1 and n2.name=N'Второй день обхода')

Или я чё-то не понимаю?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом (ну ОЧЕНЬ нужно) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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