MySQL - 当COUNT(*)返回null时如何获得0?

时间:2017-08-18 12:21:10

标签: mysql sql count

我对SQL请求有些困难。 在那个请求中,我想得到一个星期(在参数中输入)和一年(也在参数中)由科技打开的票数。 我的目标是获得这样的表格:

YEAR    WEEK TECH_ID   BACKLOG_TICKETS
2017     1      5            11
2017     1      6             1
2017     1      6             0

但问题是,当技术人员在积压(0)中没有票证时,不会创建记录,当然因为COUNT(*)返回空值。

所以这就是我真正拥有的: YEE WEEK TECH_ID BACKLOG_TICKETS 2017 1 5 11 2017 1 6 1

这是我的要求:

SET @selectedDate = DATE_ADD(STR_TO_DATE('01-01-2017', '%d-%m-%Y'), INTERVAL _week WEEK);

INSERT INTO whd_stats.backlog_tickets_by_tech_week (YEAR, WEEK, TECH_ID, BACKLOG_TICKETS_NUMBER)
    SELECT _year AS 'YEAR', _week AS 'WEEK', 
    coalesce(j.ASSIGNED_TECH_ID , 99999) AS 'TECH', 
    @backlogNumber := COUNT(j.JOB_TICKET_ID)
    FROM whd.job_ticket j
    LEFT OUTER JOIN whd.tech t ON j.ASSIGNED_TECH_ID = t.CLIENT_ID
    LEFT OUTER JOIN whd.STATUS_TYPE s ON j.STATUS_TYPE_ID = s.STATUS_TYPE_ID 
    WHERE j.DELETED = 0
    -- Create Date with the given year, then add the number of week 
    AND j.REPORT_DATE <= @selectedDate 
    AND (j.CLOSE_DATE > @selectedDate
    OR (j.CLOSE_DATE IS NULL AND s.STATUS_TYPE_NAME IN ('Open', 'Pending', 'Approval Pending')))
    GROUP BY YEAR, WEEK, TECH
ON DUPLICATE KEY UPDATE BACKLOG_TICKETS_NUMBER = @backlogNumber;

我试图用 IFNULL(COUNT(j.JOB_TICKET_ID),0)替换 COUNT(j.JOB_TICKET_ID),我也试过 COALESCE(COUNT) (j.JOB_TICKET_ID),0)但没有一个正在运作,我不再有任何想法......

你能帮帮我吗?

谢谢!

4 个答案:

答案 0 :(得分:0)

这里的一个选项是&#34;日历表&#34;做法。您可以创建一个如下所示的新表:

TECH_ID
1
2
3
4
5

您可以更改查询,使其以此日历表开头,然后向左连接。这样可以保证每个TECH_ID都会出现在结果集中,即使记录的数据中没有。{/ p>

答案 1 :(得分:0)

尝试这个

 IFNULL(j.JOB_TICKET_ID,0) AS ticketcount

答案 2 :(得分:0)

尝试使用IF

IF(COUNT(j.JOB_TICKET_ID) is NULL, 0, COUNT(j.JOB_TICKET_ID)) as backlogNumber

或CASE

(
    CASE 
        WHEN COUNT(j.JOB_TICKET_ID) IS NULL
        THEN 0
        ELSE COUNT(j.JOB_TICKET_ID)
    END
) as backlogNumber

答案 3 :(得分:0)

在Tim的帮助下,我可以找到一个解决方案,使用“日历表”,其中包含我的所有技术ID。

所以这是工作要求:

SELECT 2017 AS 'YEAR', 31 AS 'WEEK', 
tct.tech_id AS 'TECH', 
COUNT(j.JOB_TICKET_ID)
FROM whd.job_ticket j
LEFT OUTER JOIN whd.STATUS_TYPE s ON j.STATUS_TYPE_ID = s.STATUS_TYPE_ID
RIGHT JOIN whd_stats.tech_calendar_table tct ON j.ASSIGNED_TECH_ID = tct.tech_id
AND j.DELETED = 0
AND j.REPORT_DATE <= @selectedDate 
AND (j.CLOSE_DATE > @selectedDate
OR (j.CLOSE_DATE IS NULL AND s.STATUS_TYPE_NAME IN ('Open', 'Pending', 'Approval Pending')))
GROUP BY 1, 2, 3;

我真的要感谢Tim为我学习“日历表”的概念和他的耐心。