【问题标题】:Return Count 0 in group by返回分组中的计数 0
【发布时间】:2020-11-27 13:10:12
【问题描述】:

我有一个名为 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

【问题讨论】:

  • 你想为每对夫妇的名字\日期添加一个日期,还是只为每个名字添加一个日期?
  • @Massimo 对于每个名称,当错误日志中不存在的日期超过 0 时。所以是的,我想为每个名称添加一个日期。
  • 我认为我编辑我的帖子有混淆。
  • 没有混淆,说有第五个名字在任何日期都没有日志。它应该为每个日期列出还是只列出一个?
  • @Massimo 我已经删除了第 5 个名称,但如果有第 5 个名称,则输出必须包含日期为 2020-07-31 和 2020-07-30 的 helpeu5 --0。所以对于每个日期,最终输出中都必须有一个名称为 0。

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

使用左连接 -

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

【讨论】:

  • 它如何给我与我的查询相同的结果。
  • @Tarun.P,我已经编辑了我的答案 - 你现在可以查看
  • 很好用。你能对这个查询做一个简短的解释吗?如果可能的话。也帮助别人。
  • @Tarun.P,您需要找到唯一数据和主表名称的叉积,因为您希望每天都有一个输出来检查哪个产品没有任何错误。所以首先使用交叉应用找到基于两个表的名称和日期的叉积,然后使用左连接。
【解决方案2】:

我建议将查询编写为:

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 引入已有数据。

Here 是一个 dbfiddle。

【讨论】:

    【解决方案3】:

    试试这个。 它构建了一个完整的姓名和日期网格,然后用计数填充它。

     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
    

    【讨论】:

    • 你的回答也很棒。有用。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多