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

Откуда:
Сообщений: 183
Добрый день.

Есть у меня представление "FullList", в котором перечислены иностранные слова в списках (List), созданных для каждого отдельного юзера. Если слово выучено, оно помечено цифрой 1 в поле "Learned" и датой в поле "LearnDate".

UserID  ListDate    ListName   FWord  Learned  LearnDate
---------------------------------------------------------
1 2018-04-23 Список_01 8 1 2018-05-06
1 2018-04-24 Список_02 99 1 2018-05-07
2 2018-04-23 Список_а 206 0 NULL
2 2018-04-26 Список_б 235 1 2018-05-07
3 2018-04-23 Список_ф1 25 0 NULL
3 2018-04-23 Список_ф1 103 0 NULL

Я сделал два запроса, подсчитывающих количество выученных и невыученных слов по отдельному юзеру (UserID = 1).

SELECT     ListDate, ListName, COUNT(*) AS 'Learned'
FROM         FullList
WHERE     (Learned = 1)
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 1)
ORDER BY ListDate


результат:

ListDate    ListName   Learned
------------------------------
2018-04-23 Список_01 17

SELECT     ListDate, ListName, COUNT(*) AS 'Not Learned'
FROM         FullList
WHERE     (Learned = 0)
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 1)
ORDER BY ListDate


результат:

ListDate    ListName   Not Learned
------------------------------
2018-04-23 Список_01 4

Если в каком-то из списков все слова выучены (не выучены), то количество строк в этих двух результатах будет разным

Помогите, пожалуйста, объединить их в один запрос для отображения в виде гистограммы с накоплением. Вот с таким результатом

ListDate    ListName   Learned   Not Learned
--------------------------------------------
2018-04-23 Список_01 17 4
2018-04-24 Список_02 16 0
2018-04-25 Список_03 0 14

Спасибо.
15 июн 18, 13:45    [21493693]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Malyav,

sum(case Learned When 1 Then 1 end) as Learned,
sum(case Learned When 0 Then 1 end) as UnLearned
15 июн 18, 13:47    [21493701]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Или:

Count(*) as All,
Sum(Learned) as Learned,
Count(*)-Sum(Learned) as UnLearned
15 июн 18, 13:49    [21493712]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
iap
Member

Откуда: Москва
Сообщений: 46979
Kopelly
Malyav,

sum(case Learned When 1 Then 1 end) as Learned,
sum(case Learned When 0 Then 1 end) as UnLearned
Хорошо бы ELSE 0 добавить
15 июн 18, 13:50    [21493716]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Malyav
Member

Откуда:
Сообщений: 183
Я хотел, но забыл сразу написать, что у меня
"Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 6.1 (Build 7601: Service Pack 1) "
На нем чтобы работало...
15 июн 18, 13:51    [21493722]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Еще:

Sum(Learned) as Learned,
Sum(1-Learned) as UnLearned

Работать будет на любой версии SQL
15 июн 18, 13:55    [21493732]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Malyav
Member

Откуда:
Сообщений: 183
Отлично заработал запрос (правда выдавал ошибку, пока я All в скобки не взял)

SELECT     ListDate, ListName, Count(*) as [All],
sum(case Learned When 1 Then 1 Else 0 end) as Learned, 
sum(case Learned When 0 Then 1 Else 0 end) as UnLearned 
FROM         FullList
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)
ORDER BY ListDate


Kopelly и iap - огромное спасибо! Супер!

А вот с
SELECT     ListDate, ListName, 
Count(*) as [All],
Sum(Learned) as Learned,
Count(*)-Sum(Learned) as UnLearned
FROM         FullList
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)
ORDER BY ListDate


не прокатило. Поле Learned тип bit и мне пишет
Сообщение 409, уровень 16, состояние 2, строка 1
The sum or average aggregate operation cannot take a bit data type as an argument.


но это ничего, буду первый запрос использовать. Еще раз СПАСИБО.
15 июн 18, 14:13    [21493824]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Malyav,

SUM(CAST(Learned  as tinyint))
15 июн 18, 14:16    [21493848]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20535
Malyav
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)

Вам не кажется, что ЭТО разумнее заменить на
WHERE UserID = 30
GROUP BY ListDate, ListName

?
15 июн 18, 14:16    [21493849]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Malyav
Member

Откуда:
Сообщений: 183
TaPaK , да, теперь работает

SELECT     ListDate, ListName, 
Count(*) as [All],
SUM(CAST(Learned  as tinyint)) as Learned,
Count(*)-SUM(CAST(Learned  as tinyint)) as UnLearned
FROM         FullList
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)
ORDER BY ListDate


Akina
Вам не кажется, что ЭТО разумнее заменить на

Akina, и так работает. Но я недостаточно компетентен в SQL, чтобы видеть разницу. Свои count запросы я делал методом "Создать запрос в редакторе".

SELECT     ListDate, ListName, 
Count(*) as [All],
SUM(CAST(Learned  as tinyint)) as Learned,
Count(*)-SUM(CAST(Learned  as tinyint)) as UnLearned
FROM         FullList
WHERE UserID = 30
GROUP BY ListDate, ListName
ORDER BY ListDate


Спасибо вам обоим.
15 июн 18, 14:26    [21493896]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
iap
Member

Откуда: Москва
Сообщений: 46979
Akina
Malyav
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)


Вам не кажется, что ЭТО разумнее заменить на
WHERE UserID = 30
GROUP BY ListDate, ListName


?
Сервер это и так преобразует. В документации описано. Он очень умный!

Malyav
Kopelly и iap - огромное спасибо! Супер!
А я-то тут при чём?
15 июн 18, 14:41    [21493950]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20535
iap
Сервер это и так преобразует. В документации описано.
2000-й?
Malyav
я недостаточно компетентен в SQL, чтобы видеть разницу.
Ну сперва группировать всё, чтобы потом отобрать для одного, или сперва отобрать для одного и группировать только отобранную часть - разница есть?
15 июн 18, 14:43    [21493958]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
iap
Member

Откуда: Москва
Сообщений: 46979
Akina
2000-й?
По-моему любой.
Это про перенос условия, не зависящего от агрегатов, из HAVING в WHERE?
15 июн 18, 14:47    [21493981]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
as tinyint

А вдруг какой шибко умный юзер выучит 128 иностранных слов...
15 июн 18, 14:48    [21493985]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович
TaPaK
as tinyint

А вдруг какой шибко умный юзер выучит 128 иностранных слов...

ссылку на SUM давать или сами осилите?
15 июн 18, 14:52    [21493999]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два count в одну выборку  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
ссылку на SUM давать или сами осилите?

Спасибо, сам осилил!
Видимо, с чем-то таким столкнулся в 2000х (возможно с тем самым BIT), с тех пор просто перед суммированием конвертировал в конечный тип.
15 июн 18, 15:46    [21494213]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить