mysql - 如果使用 group by 和 LEFT JOIN 不存在行,则计为零

标签 mysql join

我正在练习 mysql 并卡在如下场景中:

我有如下两个表。

 Table 1 :
    Distinct_dates having DATE as my_date column name:

    Table 2:my_records having following fields

    record_id,
    record_submitter_name,
    record_submit_date as  DATETIME

    I need to get the records submitted by each submitter for each unique month and it should return 0 if no record found for a month. 

    For example: the below query gives me distinct months from distinct_dates table.
    select distinct(DATE_FORMAT(my_date,'%m-%Y')) from distinct_dates;
    +--------------------------------+
    | (DATE_FORMAT(my_date,'%m-%Y')) |
    +--------------------------------+
    | 01-2016                        |
    | 01-2017                        |
    | 02-2017                        |
    | 03-2017                        |
    +--------------------------------+
    4 rows in set (0.00 sec)

I am able to get the count of Records in each month by submitter and not getting Zero if No Record found for the particular month? 

select distinct(DATE_FORMAT(record_submit_date,'%m-%Y')),count(record_id),record_submitter_name from my_records group by DATE_FORMAT(record_submit_date,'%m-%y'),records_submitter_name;

I have basic understanding of JOINS but not able to get the correct values ,Any help or pointer will be appreciable. 

我需要通过每个 record_submitter_name 获取每个不同月份的记录数,如果用户在特定月份没有提交记录,它应该返回零?

进一步使用 LEFT Join,我能够获得当月数据不存在的不同日期的 NULL 值,以下是我查询的内容。

select distinct(DATE_FORMAT(d.my_date,'%m-%Y')),count(m.record_id), m.record_submitter_name from distinct_dates d left join my_records m on DATE_FORMAT(m.record_submit_date,'%m-%Y') = DATE_FORMAT(d.my_date,'%m-%Y') and record_submitter_name='xyz' group by d.my_date;

+----------------------------------+----------------+-------------------+
| (DATE_FORMAT(d.my_date,'%m-%Y')) | count(m.record_id) | record_submitter_name |
+----------------------------------+----------------+-------------------+
| 01-2016                          |              1 | xyz               |
| 01-2017                          |              1 | xyz               |
| 02-2017                          |              0 | NULL              |
| 03-2017                          |              0 | NULL              |
+----------------------------------+----------------+-------------------+

但是当使用 group by 子句时它不起作用: 使用 Group By close ,我没有收到所需的结果:

select distinct(DATE_FORMAT(d.my_date,'%m-%Y')),count(m.record_id), m.record_submitter_name from distinct_dates d left join my_records m on DATE_FORMAT(m.record_submit_date,'%m-%Y') = DATE_FORMAT(d.my_date,'%m-%Y') group by d.my_date,record_submitter_name;

Following NULL results was not in the output ....
    .
      +----------------------------------+----------------+-------------------+
        | (DATE_FORMAT(d.my_date,'%m-%Y')) | count(m.record_id) | record_submitter_name |
        +----------------------------------+----------------+-------------------+
        | 01-2016                          |              1 | xyz               |
        | 01-2017                          |              1 | xyz               |
        | 02-2017                          |              0 | NULL              |
        | 03-2017                          |              0 | NULL              |
        +----------------------------------+----------------+-------------------+

使用 LEFT Join 的 group by 子句有问题吗?

谢谢

最佳答案

您需要两个主表,Date Master 和另一个是 Employee Master,并创建两个表的叉积,您将在其中获得所有员工条目的月份和年份。

这里我有两个表 TABLE_A 作为日期主人和 TABLE_B 作为员工主人

创建叉积: SELECT DISTINCT A.MONTH,A.YEAR,A.MONTH_YEAR,B.EMP_ID,B.EMP_NAME FROM TABLE_A A JOIN TABLE_B B ON 1=1

现在在需要计算该员工记录数的表上执行左连接。

SELECT DISTINCT A.MONTH,A.YEAR,A.MONTH_YEAR,B.EMP_ID,B.EMP_NAME 
,COUNT(C.ASSESMENT)AS COUNTS
FROM TABLE_A A
JOIN TABLE_B B
ON 1=1
LEFT JOIN TABLE_C C
ON B.EMP_ID=C.EMP_ID
AND A.MONTH_YEAR=C.MONTH_YEAR
GROUP BY A.MONTH,A.YEAR,A.MONTH_YEAR,B.EMP_ID,B.EMP_NAME 
--ORDER BY EMP_ID,YEAR,MONTH

结果会是这样的:- Result set

关于mysql - 如果使用 group by 和 LEFT JOIN 不存在行,则计为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43039428/

相关文章:

mysql - 检查数组至少包含数组的所有值

java - 配置项目后,SonarQube 未在仪表板中显示任何问题

MySQL 如何更正此子查询?

c# - 使用 2 个表之间的可选/条件联接进行查询

mysql - SQL 找出两个日期时间列之间的小时数

c# - C# linq 支持 "anti join"语义吗?

mysql - JOIN ON 语句 MySQL 中的未知列

mysql 在值中展开一个字段循环并创建一个新列,其标题与这些值相关联

mysql - 当一个数据有撇号标记时,ajax请求出现错误(无效的json响应)

mysql - 按索引使用排序