powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить два count в одну выборку
16 сообщений из 16, страница 1 из 1
Как объединить два count в одну выборку
    #39661252
Malyav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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).

Код: sql
1.
2.
3.
4.
5.
6.
SELECT     ListDate, ListName, COUNT(*) AS 'Learned'
FROM         FullList
WHERE     (Learned = 1)
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 1)
ORDER BY ListDate



результат:

Код: plaintext
1.
2.
ListDate    ListName   Learned
------------------------------
2018-04-23  Список_01  17

Код: sql
1.
2.
3.
4.
5.
6.
SELECT     ListDate, ListName, COUNT(*) AS 'Not Learned'
FROM         FullList
WHERE     (Learned = 0)
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 1)
ORDER BY ListDate



результат:

Код: plaintext
1.
2.
ListDate    ListName   Not Learned
------------------------------
2018-04-23  Список_01  4

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

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

Код: plaintext
1.
2.
3.
4.
ListDate    ListName   Learned   Not Learned
--------------------------------------------
2018-04-23  Список_01  17        4
2018-04-24  Список_02  16        0
2018-04-25  Список_03  0         14

Спасибо.
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661253
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Malyav,

Код: sql
1.
2.
sum(case Learned When 1 Then 1 end) as Learned,
sum(case Learned When 0 Then 1 end) as UnLearned
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661256
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или:

Код: sql
1.
2.
3.
Count(*) as All,
Sum(Learned) as Learned,
Count(*)-Sum(Learned) as UnLearned
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661257
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KopellyMalyav,

Код: sql
1.
2.
sum(case Learned When 1 Then 1 end) as Learned,
sum(case Learned When 0 Then 1 end) as UnLearned

Хорошо бы ELSE 0 добавить
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661258
Malyav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я хотел, но забыл сразу написать, что у меня
"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) "
На нем чтобы работало...
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661260
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще:

Код: sql
1.
2.
Sum(Learned) as Learned,
Sum(1-Learned) as UnLearned


Работать будет на любой версии SQL
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661275
Malyav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично заработал запрос (правда выдавал ошибку, пока я All в скобки не взял)

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 - огромное спасибо! Супер!

А вот с
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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.

но это ничего, буду первый запрос использовать. Еще раз СПАСИБО.
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661280
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Malyav,

Код: sql
1.
SUM(CAST(Learned  as tinyint))
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661281
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Malyav
Код: sql
1.
2.
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)


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


?
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661291
Malyav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK , да, теперь работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 запросы я делал методом "Создать запрос в редакторе".

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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



Спасибо вам обоим.
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661302
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMalyav
Код: sql
1.
2.
GROUP BY ListDate, ListName, UserID
HAVING      (UserID = 30)



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



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

Malyav Kopelly и iap - огромное спасибо! Супер!А я-то тут при чём?
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661304
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapСервер это и так преобразует. В документации описано.2000-й?
Malyavя недостаточно компетентен в SQL, чтобы видеть разницу.Ну сперва группировать всё, чтобы потом отобрать для одного, или сперва отобрать для одного и группировать только отобранную часть - разница есть?
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661307
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina2000-й?По-моему любой.
Это про перенос условия, не зависящего от агрегатов, из HAVING в WHERE?
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661308
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
Код: sql
1.
as tinyint


А вдруг какой шибко умный юзер выучит 128 иностранных слов...
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661311
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичTaPaK
Код: sql
1.
as tinyint


А вдруг какой шибко умный юзер выучит 128 иностранных слов...
ссылку на SUM давать или сами осилите?
...
Рейтинг: 0 / 0
Как объединить два count в одну выборку
    #39661350
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKссылку на SUM давать или сами осилите?
Спасибо, сам осилил!
Видимо, с чем-то таким столкнулся в 2000х (возможно с тем самым BIT), с тех пор просто перед суммированием конвертировал в конечный тип.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить два count в одну выборку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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