MySQL заполнить пропущенные значения 0 - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть запрос MySQL, который иногда приводит к пропущенным значениям.Для своей панели инструментов я хотел бы заполнить эти значения, но предпочел бы избегать создания фиктивных таблиц, если смогу.

запрос:

SELECT COUNT(Comms_Timestamp) as call_count,DAYOFWEEK(Comms_Timestamp) as bucket 
FROM tblTest GROUP BY bucket;

приводит к

+------------+--------+
| call_count | bucket |
+------------+--------+
|          4 |      1 |
|          7 |      2 |
|          7 |      3 |
|          1 |      5 |
|          6 |      6 |
|          1 |      7 |
+------------+--------+

В приведенном выше примере вы видите, что ведро 4 отсутствует.Я рассматриваю метод, в котором объединение заключается в массиве выбора объединения, однако, поскольку оба поля являются агрегатами, я не уверен, как это сделать.

тестовые данные

+---------------------+
| Comms_Timestamp     |
+---------------------+
| 2018-12-24 06:04:05 |
| 2018-12-24 12:18:39 |
| 2018-12-21 04:24:31 |
| 2018-12-21 08:32:44 |
| 2018-12-30 01:41:06 |
| 2018-12-30 01:53:00 |
| 2018-12-30 01:53:39 |
| 2018-12-30 02:00:01 |
| 2018-12-17 15:55:03 |
| 2018-12-17 16:04:12 |
| 2018-12-17 16:05:41 |
| 2018-12-17 16:07:43 |
| 2018-12-17 16:10:25 |
| 2018-12-18 14:03:22 |
| 2018-12-18 14:03:29 |
| 2018-12-18 14:10:19 |
| 2018-12-18 14:10:29 |
| 2018-12-18 14:10:31 |
| 2018-12-18 14:10:47 |
| 2018-12-18 14:10:55 |
| 2018-12-20 08:21:07 |
| 2018-12-28 11:03:59 |
| 2018-12-28 12:06:40 |
| 2018-12-28 12:15:01 |
| 2018-12-28 14:29:24 |
| 2019-01-05 13:33:43 |
+---------------------+

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать функцию IFNULL () в MYSQL:

SELECT IFNULL(COUNT(C.Comms_Timestamp),0) as call_count,IFNULL(DAYOFWEEK(C.Comms_Timestamp),0) as bucket 
FROM tblCommunication as C LEFT JOIN tblCareTeam as CT on C.id_Case = CT.id_Case 
GROUP BY CT.id_Site,bucket 
HAVING CT.id_Site=8;
0 голосов
/ 08 февраля 2019

Поскольку вы используете mysql и не имеете доступа к опции seq_, вот альтернативный способ:

SELECT A.x AS bucket, IF(ISNULL(COUNT(t2.Comms_Timestamp)), 0, COUNT(t2.Comms_Timestamp)) AS call_count FROM
(select 1 x union select 2 union select 3 union select 4 union select 5 union select 6 union select 7) AS A
LEFT JOIN tblTest AS t2 ON DAYOFWEEK(t2.Comms_Timestamp) = A.x
GROUP BY bucket
ORDER BY bucket;

Возможно, это не самый красивый вариант, но он будет делать то, что вам нужно.

Вот ссылка дд фидделя: дб <> фиддл

0 голосов
/ 08 февраля 2019

Если вы используете MariaDB, существует их Механизм хранения последовательностей

Для этой таблицы создание не требуется, однако необходимо знать максимальное значение.

select version();
| version()                                   |
| :------------------------------------------ |
| 10.3.11-MariaDB-1:10.3.11+maria~stretch-log |
create table bob (a int)
insert into bob values (4),(2)
select * from seq_1_to_5
| seq |
| --: |
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
SELECT s.seq, bob.a
FROM seq_1_to_5 s 
LEFT JOIN bob 
  ON bob.a = s.seq
ORDER BY s.seq
seq |    a
--: | ---:
  1 | <em>null</em>
  2 |    2
  3 | <em>null</em>
  4 |    4
  5 | <em>null</em>

дБ <> скрипка здесь

...