我对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)但没有一个正在运作,我不再有任何想法......
你能帮帮我吗?
谢谢!
答案 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为我学习“日历表”的概念和他的耐心。