Вернуть счетчик 0 в группе - PullRequest
       137

Вернуть счетчик 0 в группе

0 голосов
/ 07 августа 2020

У меня есть таблица под названием Errorlogs со следующими данными

+----+-------------+------------+
| ID | sps_Bereich | Date       |
+----+-------------+------------+
| 10 | helpeu1     | 2020-07-31 |
+----+-------------+------------+
| 11 | helpeu2     | 2020-07-31 |
+----+-------------+------------+
| 12 | helpeu3     | 2020-07-31 |
+----+-------------+------------+
| 13 | helpeu3     | 2020-07-31 |
+----+-------------+------------+
| 14 | helpeu4     | 2020-07-31 |
+----+-------------+------------+
| 15 | helpeu3     | 2020-07-30 |
+----+-------------+------------+
| 16 | helpeu4     | 2020-07-30 |
+----+-------------+------------+
| 17 | helpeu4     | 2020-07-30 |
+----+-------------+------------+
| 18 | helpeu4     | 2020-07-30 |
+----+-------------+------------+

У меня есть другая таблица под названием Bereich

+----+---------+
| ID | Name    |
+----+---------+
| 1  | helpeu1 |
+----+---------+
| 2  | helpeu2 |
+----+---------+
| 3  | helpeu3 |
+----+---------+
| 4  | helpeu4 |
+----+---------+

Я хотел бы сгруппировать по sps_bereich и Date и Я использую следующий запрос

select sps_bereich, [Date], count(*) as [Nr of errors] from [ErrorLogs] 
   where SPS_Bereich IN (
   select Name from [Bereich]
   )  
   group by SPS_Bereich, Date 
   order by date desc, SPS_Bereich asc

, он дает мне следующий результат.

+-------------+------------+--------------+
| sps_bereich | Date       | Nr of errors |
+-------------+------------+--------------+
| helpeu1     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu2     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu3     | 2020-07-31 | 2            |
+-------------+------------+--------------+
| helpeu4     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu3     | 2020-07-30 | 1            |
+-------------+------------+--------------+
| helpeu4     | 2020-07-30 | 3            |
+-------------+------------+--------------+

то, что я хотел бы, это включить sps_bereich там, где нет данных. в этом случае я хотел бы добавить helpeu1,helpeu2 как 0 для даты 2020-07-30

Я хотел бы получить следующий результат.

+-------------+------------+--------------+
| sps_bereich | Date       | Nr of errors |
+-------------+------------+--------------+
| helpeu1     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu2     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu3     | 2020-07-31 | 2            |
+-------------+------------+--------------+
| helpeu4     | 2020-07-31 | 1            |
+-------------+------------+--------------+
| helpeu1     | 2020-07-30 | 0            |
+-------------+------------+--------------+
| helpeu2     | 2020-07-30 | 0            |
+-------------+------------+--------------+
| helpeu3     | 2020-07-30 | 1            |
+-------------+------------+--------------+
| helpeu4     | 2020-07-30 | 3            |
+-------------+------------+--------------+

Я думал, что добавление Предложение IN должно возвращать мне все значения, но это не так.

вот SQLFiddle .

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Я бы посоветовал написать запрос как:

select b.name, d.date, count(el.id) as num_errors 
from Bereich b cross join
     (select distinct date from errorlogs) d left join
     errorlogs el
     on el.date = d.date and el.sps_Bereich = b.name 
group by b.name, d.date
order by d.date desc, b.name;

Идея довольно проста. Используйте cross join для создания строк, которые вы хотите в результирующем наборе. Затем используйте left join, чтобы ввести существующие данные.

Здесь - скрипт db <>.

2 голосов
/ 07 августа 2020

Использовать левое соединение -

DEMO

select A.Name, A.date,coalesce(B.cnt,0) as no_of_errors 
from
(select distinct date,name from Errorlogs cross apply Bereich)A
left join 
(select sps_Bereich, [Date],count(*) cnt
from Errorlogs group by sps_Bereich, [Date]
)B
on A.date=B.date and A.Name=B.sps_Bereich order by A.date desc, A.name asc
1 голос
/ 07 августа 2020

Попробуйте это. Он строит полную сетку имен и дат, а затем заполняет ее счетчиками.

 select grid.name,grid.date,coalesce(cnt.cnt,0) from
  
    (select distinct e.date, d.name from errorlogs e, Bereich d) grid
    left outer join
    (
   select b.sps_Bereich, b.date, count(*) as cnt from [ErrorLogs] b
  
     group by b.sps_Bereich,b.date
    ) cnt  
    on grid.date=cnt.date and grid.name=cnt.sps_bereich
...