Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307

Подсчёт строк с пустыми значениями

20.11.2020, 10:24. Показов 2385. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Необходимо получить таблицу с некоторыми рассчётами.

SQL
1
2
3
4
5
6
7
8
9
10
SELECT 
idq,
COUNT(npp),
AVG(dat_v - dat_p) AS avg_time,
MAX(dat_v - dat_p) AS max_time
FROM queue.stat 
WHERE dat_p BETWEEN '2020-10-01' AND '2020-10-31'
AND idq IN (1, 2, 3, 9, 10)
AND dat_p::TIME BETWEEN '8:00:00' AND '8:59:59'
GROUP BY idq;
При данном запросе, если idq = 10, выдаётся NULL и соответственно строки где idq = 10 с нулевыми значениями не выдаётся.
Пробовал и с LEFT JOIN, и с CASE - но так и не удалось вывести строку с пустыми значениями... Как это можно сделать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2020, 10:24
Ответы с готовыми решениями:

Заполнение дней в таблице пустыми значениями
Доброго времени суток. Стоит задача сделать выборку значения hours за весь месяц, вне зависимости от наличия значения hours. В колонке...

Вывести все строки таблицы БД, кроме строк с пустыми значениями определенного поля
Нужно вывести все строки, кроме строк с пустыми значениями определенного поля Как написать это правильно? Так выдает...

Вывод из таблицы полей с пустыми значениями
Как вывести пустые значения из таблицы по запросу из хранимой процедуры? Значения с параметрами выбираються, а с пустыми не хотят. Как...

9
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
20.11.2020, 10:29
Prtoy, в строке 8 попробуй так (если я правильно понял) :

Code
1
AND ( (idq IN (1, 2, 3, 9, 10)) or (idq is null) )
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
20.11.2020, 10:52  [ТС]
Алексей1153, не получилось, результат тот же.

Добавлено через 3 минуты
Результат:
Code
1
2
3
4
1;240;"00:02:22";"00:48:13"
2;382;"00:02:46";"00:21:59"
3;483;"00:01:56";"00:32:34"
9;373;"00:02:00";"00:58:02"
А задача, чтобы вышло что-то типа:
Code
1
2
3
4
5
1;240;"00:02:22";"00:48:13"
2;382;"00:02:46";"00:21:59"
3;483;"00:01:56";"00:32:34"
9;373;"00:02:00";"00:58:02"
10;0;"NULL";"NULL"
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
20.11.2020, 11:30
Prtoy, ну так, блин, оказывается, что нулевые значения должны быть не в idq , а в dat_p и dat_v ! Этого же непонятно из первого поста

вот так сходу я пока тоже не соображу тогда, как это сделать

Добавлено через 12 минут
предположу, что AVG и MAX не сумеют работать с NULL, поэтому придётся разделить на два запроса, затем объединить результат (не join, а именно один за другим)

первый запрос - (тут только подправил проверку времени на null)
SQL
1
2
3
4
5
6
7
8
9
10
SELECT 
idq,
COUNT(npp),
AVG(dat_v - dat_p) AS avg_time,
MAX(dat_v - dat_p) AS max_time
FROM queue.stat 
WHERE (dat_p IS NOT NULL) AND (dat_v IS NOT NULL) AND (dat_p BETWEEN '2020-10-01' AND '2020-10-31')
AND idq IN (1, 2, 3, 9, 10)
AND dat_p::TIME BETWEEN '8:00:00' AND '8:59:59'
GROUP BY idq;
второй запрос
SQL
1
2
3
4
5
6
7
8
9
SELECT 
idq,
COUNT(npp),
NULL AS avg_time,
NULL AS max_time
FROM queue.stat 
WHERE (dat_p IS NULL) OR (dat_v IS NULL)
AND idq IN (1, 2, 3, 9, 10)
GROUP BY idq;
как объединить - гуглить про union all

после объединения можно отсортировать по idq


сам не пробовал, нет инструмэнта под рукой
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
20.11.2020, 11:54  [ТС]
Алексей1153, нет, тоже не то получается.

В данном примере, когда idq = 10 - то везде должны быть нули.
idq - это ид электронной очереди, avg_time и max_time - это подсчёт среднего и максимального времени ожидания, и поскольку в условии AND dat_p::TIME BETWEEN '8:00:00' AND '8:59:59' - то есть время с 8 до 9 грубо говоря, в это время не может быть посетителей потому что офис с idq = 10 работает с 12 часов, то есть в COUNT тоже должен быть ноль. Из-за того что вся строка получается пустая, она из выборки вообще выпадает, а нужно чтоб она оставалась но писались нули. Надеюсь понятнее сейчас объяснил...

Нужно сделать всё одним запросом, потому что в дальнейшем динамически время будет подставляться другое, с 9 до 10, и т.д...
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
20.11.2020, 12:20
попробуй копать вот в такую сторону (могут быть синтаксические ошибки)

SQL
1
2
3
4
5
6
7
SELECT idq, COUNT(npp), AVG(time_delta) AS avg_time, MAX(time_delta) AS max_time
   FROM
   (
       SELECT idq, npp, (dat_v - dat_p) AS time_delta FROM queue.stat WHERE idq IN (1, 2, 3, 9, 10)
   )
   WHERE dat_p BETWEEN '2020-10-01' AND '2020-10-31' AND dat_p::TIME BETWEEN '8:00:00' AND '8:59:59'
      GROUP BY idq
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
20.11.2020, 22:28
когда нет записей, то в группировку ничего не попадает, поэтому case действительно бесполезен.
но вот left join здесь как раз подойдет

SQL
1
2
3
4
5
6
7
WITH 
grps(grp_id) AS (VALUES (1), (2), (3), (9), (10))
SELECT grp_id, COUNT(npp), avg(dat_v-dat_p) AS avg_time, MAX(dat_v-dat_p) AS max_time 
FROM grps
LEFT JOIN stat ON grps.grp_id=stat.idq
GROUP BY grp_id 
ORDER BY grp_id;
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
21.11.2020, 14:35  [ТС]
grgdvo, спасибо. Но при добавлении условия WHERE опять считает по-старому...
SQL
1
WHERE (dat_p IS NOT NULL) AND (dat_v IS NOT NULL) AND (dat_p BETWEEN '2020-10-01' AND '2020-10-31')
Также, дополнительный вопрос. Как быть если id подразделений также надо получать запросом?
SQL
1
2
WITH 
grps(grp_id) AS (SELECT id FROM другая_таблица)
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
21.11.2020, 20:50
Лучший ответ Сообщение было отмечено Prtoy как решение

Решение

Цитата Сообщение от Prtoy Посмотреть сообщение
Также, дополнительный вопрос. Как быть если id подразделений также надо получать запросом?

SQL
1
2
WITH 
grps(grp_id) AS (SELECT id FROM другая_таблица)
да, так можно

а, забыл про выпорку по времени
попробуйте добавить условие под JOIN

SQL
1
LEFT JOIN stat ON grps.grp_id=stat.idq AND dat_p BETWEEN '2020-10-01' AND '2020-10-31' AND dat_p::TIME BETWEEN '8:00:00' AND '8:59:59'
1
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
21.11.2020, 21:22  [ТС]
grgdvo, спасибо, получилось!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2020, 21:22
Помогаю со студенческими работами здесь

Предпоследнее значение в столбце с пустыми значениями
Никак не могу найти решение для следующей задачи: Есть таблица в один её столбец с неопределенной периодичностью вносятся числовые...

Удаление столбцов с пустыми или ошибочными значениями
Sheets("CBR").select For i = 4 To 59 Step 1 If Cells(17, i) = "" Or Cells(17, i) = "#VALUE!" Then ...

Можно ли заполнить массив типа int пустыми значениями?
.....

Заполнить массив char пустыми значениями до определенного размера
Здравствуйте, вопрос в следующем. Есть строка c логином пользователя, перевожу ее в массив символов так чтобы 1 символ занимал 1 кб. ...

Почему некоторые ячейки листа с 20 заполняются пустыми значениями?
При выводе данных из массива (массив 3х мерный: 4х60х150х200), примерно с листа 20-25 хаотично не заполняются, т. е. становятся пустыми или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru