返回值,即使为 null、0 或不存在



我想创建一些报告,以便我可以快速获取有关我们帮助台的数据,我正在使用在MySQL 5.5上运行的GLPI

我有下面的代码,它返回了一些有用的信息,但还不够,所以它可以放入一个漂亮的堆叠图中,这是他所要求的。为了获得足够的数据来实现这一点,我需要紧急程度为零,天数也为零,然后我可以将数据转换为Excel中的表格并构建图形。

当前查询:

SELECT DATE_FORMAT(date,'%d/%m/%Y') AS Date,Urgency,COUNT(*) as Tickets 
FROM glpi.glpi_tickets
WHERE month(date)=month(NOW())
GROUP BY urgency ORDER BY date,urgency ASC;

这将返回:

# Date, Urgency, Tickets
'07/06/2016', '3', '10'
'10/06/2016', '2', '1'
'14/06/2016', '1', '1'
'14/06/2016', '5', '1'

理想情况下,我希望它显示如下:

# Date, Urgency, Tickets
'07/06/2016', '1', '0'
'07/06/2016', '2', '0'
'07/06/2016', '3', '10'
'07/06/2016', '4', '0'
'07/06/2016', '5', '0'
'08/06/2016', '1', '0'
'08/06/2016', '2', '0'
'08/06/2016', '3', '0'
'08/06/2016', '4', '0'
'08/06/2016', '5', '0'
...
'14/06/2016', '1', '1'
'14/06/2016', '2', '0'
'14/06/2016', '3', '0'
'14/06/2016', '4', '0'
'14/06/2016', '5', '1'

等等。

我有点掌握了SQL(自学)的窍门,所以非常感谢所有和任何帮助。

编辑:添加了架构,我认为这就是您所要求的(希望它有效)http://sqlfiddle.com/#!9/715c7

查询每

urgency生成一行,因为您仅按该列进行分组。 为了查看每个日期和紧急程度的不同结果,您必须修改您的分组依据。

SELECT 
    DATE_FORMAT(date,'%d/%m/%Y') AS Date,
    Urgency,
    COUNT(*) as Tickets 
FROM 
    glpi.glpi_tickets
WHERE 
    month(date)=month(NOW())
GROUP BY 
    DATE(date),
    urgency 
ORDER BY 
    date, urgency ASC;
我认为

这就是你要找的。虽然我没有架构,但我尝试编写查询。我认为这就是你要找的。(请检查SQL,我已经编辑过。它应该生成一个您想要的报告,如果没有日期的数据,则只会缺少记录。

    select DATE_FORMAT(dummy.date,'%d/%m/%Y') Date, dummy.Urgency, ifnull(main.Tickets, 0) Tickets  from 
(select * from 
(select distinct date(date) date from glpi_tickets
    WHERE month(date)=month(NOW()) ) dates
cross join 
(select distinct Urgency from glpi_tickets) urgency
order by Date, Urgency) dummy
left join 
(SELECT date(date) date, Urgency, COUNT(*) as Tickets 
FROM glpi_tickets
WHERE month(date)=month(NOW())
GROUP BY date(date), Urgency  
ORDER BY date(date), Urgency) main
on dummy.date = main.date
and dummy.Urgency = main.Urgency
order by dummy.date asc, Urgency asc

我想下面的SQL可以满足您的目的,我从这里得到了一些帮助。您需要优化大数据的查询。

select DATE_FORMAT(dummy.date,'%d/%m/%Y') Date, dummy.Urgency, ifnull(main.Tickets, 0) Tickets  from 
(select * from 
(SELECT date_field date
FROM
(SELECT
        MAKEDATE(YEAR(NOW()),1) +
        INTERVAL (MONTH(NOW())-1) MONTH +
        INTERVAL daynum DAY date_field
    FROM
    (SELECT t*10+u daynum
        FROM
            (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) A,
            (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3
            UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
            UNION SELECT 8 UNION SELECT 9) B
        ORDER BY daynum
    ) AA
) AAA
WHERE MONTH(date_field) = MONTH(NOW())
and date_field >= (select min(date(date)) from glpi_tickets WHERE month(date)=month(NOW())) 
and date_field <= (select max(date(date)) from glpi_tickets WHERE month(date)=month(NOW())) ) dates
cross join 
(select distinct Urgency from glpi_tickets) urgency
order by date, Urgency) dummy
left join 
(SELECT date(date) date, Urgency, COUNT(*) as Tickets 
FROM glpi_tickets
WHERE month(date)=month(NOW())
GROUP BY date(date), Urgency  
ORDER BY date(date), Urgency) main
on dummy.date = main.date
and dummy.Urgency = main.Urgency
order by dummy.date asc, Urgency asc

所以这就是我最终所做的,它似乎提供了我想要的数据。

首先,我创建了一个新表来存储数据:

    CREATE TABLE glpi_plugin_ns_ticketstats
    (
    id INT(11),
    daterun date,
    timerun time,
    totaltickets INT(11),
    verylow INT(11),
    low INT(11),
    med INT(11),
    high INT(11),
    veryhigh INT(11));

然后,我构建了一个存储过程来收集和填充数据:

USE `glpi`;
DROP procedure IF EXISTS `Daily_Ticket_Stats`;
DELIMITER $$
USE `glpi`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Daily_Ticket_Stats`()
BEGIN
declare todayd date;
## Declaring the variable for the daterun column ##
declare todayt time;
## Declaring the variable for the timerun column ##
declare totalt int(11);
## Declaring the variable for totaltickets column ##
declare vlow int (11);
## Declaring the variable for verylow column ##
declare low int(11);
## Declaring the variable for low column ##
declare med int(11);
## Declaring the variable for med column ##
declare high int (11);
## Declaring the variable for high column ##
declare vhigh int(11);
## Declaring the variable for veryhigh column ##
    set todayd = CURDATE();
    ## Set date to today ##
    set todayt = CURTIME();
    ## Set time to now ##
    set totalt = (SELECT COUNT(*) as ttickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW()));
    ## This has set the total for the total tickets variable ##
    set vlow = (SELECT COUNT(*) as vltickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW())
        AND urgency = '1');
    ## This has set the total for the very low urgency tickets variable ##
    set low = (SELECT COUNT(*) as ltickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW())
        AND urgency = '2');
    ## This has set the total for the low urgency tickets variable ##
    set med = (SELECT COUNT(*) as mtickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW())
        AND urgency = '3');
    ## This has set the total for the medium urgency tickets variable ##
    set high = (SELECT COUNT(*) as htickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW())
        AND urgency = '4');
    ## This has set the total for the high urgency tickets variable ##
    set vhigh = (SELECT COUNT(*) as vhtickets 
        FROM glpi.glpi_tickets
    WHERE day(date)=day(NOW())
        AND urgency = '5');
IF EXISTS(
    SELECT *
    FROM glpi.glpi_plugin_ns_ticketstats 
    WHERE daterun = CURDATE())
    THEN
BEGIN
    UPDATE glpi.glpi_plugin_ns_ticketstats 
SET 
    timerun = CURTIME(),
    totaltickets = totalt,
    verylow = vlow,
    low = low,
    med = med,
    high = high,
    veryhigh = vhigh
WHERE
    daterun = CURDATE();
END;
ELSE
INSERT INTO glpi.glpi_plugin_ns_ticketstats VALUES (NULL,todayd,todayt,totalt,vlow,low,med,high,vhigh);
END IF;
END
#$$
DELIMITER ;

然后,我将此过程设置为每小时运行一次,因此如果我的经理希望在白天参考它们,统计信息是最新的(我直接在 mysql 服务器终端上输入了这个):

CREATE EVENT TicketStatusUpdate
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 29 MINUTE
DO
CALL Daily_Ticket_Stats();

29分钟是因为我希望它尽可能接近一小时。

现在,它以一种允许我在Excel中创建堆叠图的格式输出可爱的数据(6月1日至16日的欺骗性条目,所以我有月初的条目):

# id, daterun, timerun, totaltickets, verylow, low, med, high, veryhigh
'1', '2016-06-01', '23:00:00', '0', '0', '0', '0', '0', '0'
'2', '2016-06-02', '23:00:00', '0', '0', '0', '0', '0', '0'
'3', '2016-06-03', '23:00:00', '0', '0', '0', '0', '0', '0'
'4', '2016-06-04', '23:00:00', '0', '0', '0', '0', '0', '0'
'5', '2016-06-05', '23:00:00', '0', '0', '0', '0', '0', '0'
'6', '2016-06-06', '23:00:00', '0', '0', '0', '0', '0', '0'
'7', '2016-06-07', '23:00:00', '0', '0', '0', '0', '0', '0'
'8', '2016-06-08', '23:00:00', '0', '0', '0', '0', '0', '0'
'9', '2016-06-09', '23:00:00', '0', '0', '0', '0', '0', '0'
'10', '2016-06-10', '23:00:00', '0', '0', '0', '0', '0', '0'
'11', '2016-06-11', '23:00:00', '0', '0', '0', '0', '0', '0'
'12', '2016-06-12', '23:00:00', '0', '0', '0', '0', '0', '0'
'13', '2016-06-13', '23:00:00', '0', '0', '0', '0', '0', '0'
'14', '2016-06-14', '23:00:00', '0', '0', '0', '0', '0', '0'
'15', '2016-06-15', '23:00:00', '0', '0', '0', '0', '0', '0'
'16', '2016-06-16', '23:00:00', '0', '0', '0', '0', '0', '0'
'17', '2016-06-17', '12:31:22', '4', '1', '0', '0', '0', '3'

然后,这让我可以执行select,以便仅将当前月份导入Excel:

select * from glpi.glpi_plugin_ns_ticketstats
where month(daterun)=month(NOW())

我会把它留在这里,所以如果有人想使用它,他们可以,感谢大家的时间并帮助:)

iFr4g

相关内容

  • 没有找到相关文章

最新更新