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

Откуда:
Сообщений: 8
Всем привет! Помогите, пожалуйста, с составлением запроса. Есть таблица:
Id	UserId	      IsDs
1 1 0
2 1 0
3 2 1
4 1 1
5 2 1
6 2 0
7 2 1
8 3 1

Нужно вывести список всех уникальных UserId с указанием количества тех, у кого IsDs установлен в 1 и тех, у кого он сброшен в 0. То есть для указанного примера результат должен быть таким:
UserId	        WithDs	      WithoutDs
1 1 2
2 3 1
3 1 0

Я делаю так:
SELECT DISTINCT (UserId)
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = UserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = UserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat


Но это работает не правильно, т.к. SQL берёт не тот UserId во второй и третьей строке, т.е. если изменить запрос так:
SELECT DISTINCT (UserId) AS StatUserId
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = StatUserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = StatUserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat

то ругается на StatUserId. Как можно переделать запрос, чтобы работало правильно?
17 сен 12, 16:41    [13177414]     Ответить | Цитировать Сообщить модератору
 Re: Использование выбранного значения во вложенных запросах  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
если правильно понял, то заменить подзапросы на sum(case ...) и group by
17 сен 12, 16:47    [13177471]     Ответить | Цитировать Сообщить модератору
 Re: Использование выбранного значения во вложенных запросах  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
monSql
Всем привет! Помогите, пожалуйста, с составлением запроса. Есть таблица:
Id	UserId	      IsDs
1 1 0
2 1 0
3 2 1
4 1 1
5 2 1
6 2 0
7 2 1
8 3 1

Нужно вывести список всех уникальных UserId с указанием количества тех, у кого IsDs установлен в 1 и тех, у кого он сброшен в 0. То есть для указанного примера результат должен быть таким:
UserId	        WithDs	      WithoutDs
1 1 2
2 3 1
3 1 0

Я делаю так:
SELECT DISTINCT (UserId)
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = UserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = UserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat


Но это работает не правильно, т.к. SQL берёт не тот UserId во второй и третьей строке, т.е. если изменить запрос так:
SELECT DISTINCT (UserId) AS StatUserId
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = StatUserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = StatUserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat

то ругается на StatUserId. Как можно переделать запрос, чтобы работало правильно?


а ошибка, скорее всего, что забыли и там и там символ "запятая" в обоих запросах

SELECT DISTINCT (UserId),
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = UserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = UserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat


SELECT DISTINCT (UserId) AS StatUserId,
(SELECT COUNT(*) FROM ISearchStat iss1 WHERE iss1.UserId = StatUserId AND IsDs = 0) AS WithDs,
(SELECT COUNT(*) FROM ISearchStat iss2 WHERE iss2.UserId = StatUserId AND IsDs = 1) AS WithoutDs
FROM ISearchStat
17 сен 12, 16:49    [13177493]     Ответить | Цитировать Сообщить модератору
 Re: Использование выбранного значения во вложенных запросах  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
SELECT UserId,
SUM(CASE IsDs WHEN 0 THEN 1 ELSE 0 END) AS WithDs,
SUM(CASE IsDs WHEN 1 THEN 0 ELSE 1 END) AS WithoutDs
FROM ISearchStat
GROUP BY UserId
17 сен 12, 16:50    [13177507]     Ответить | Цитировать Сообщить модератору
 Re: Использование выбранного значения во вложенных запросах  [new]
monSql
Member

Откуда:
Сообщений: 8
С запятой я сделал опечатку, т.к. упрощал запрос, а вот SUM (CASE...) + GROUP BY действительно работает и это как раз то, что нужно. Огромное всем спасибо!
17 сен 12, 16:55    [13177571]     Ответить | Цитировать Сообщить модератору
 Re: Использование выбранного значения во вложенных запросах  [new]
Зачот!
Guest
Jovanny,
у Вас
SUM(CASE IsDs WHEN 0 THEN 1 ELSE 0 END) AS WithDs,

считает тех, у кого 0, а
SUM(CASE IsDs WHEN 1 THEN 0 ELSE 1 END) AS WithoutDs

тех, у кого не 1.
выглядит забавно.
на самом деле, если IsDS in (0,1), можно и так сделать

SELECT UserId,
SUM(IsDs) AS WithDs,
SUM(1-IsDs) AS WithoutDs
  FROM ISearchStat
GROUP BY UserId
17 сен 12, 18:17    [13178256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить