2016-06-14 59 views
1

我想创造一些报告让我拿很快对我们的服务支持,我使用GLPI这是在MySQL 5.5返回值,即使NULL,0或不存在

运行我有下面的代码,它的数据返回一些有用的信息,但还不够,所以它可以放入一个相当堆积的图中,这是他所要求的。为了获得足够的数据来实现这一目标,我需要紧迫性为零,日期也为零,然后我可以将数据转换为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

+2

的可能的复制[mysql如何填写范围缺少的日期?(http://stackoverflow.com/questions/3538858/mysql-how-to-fill-missing-dates-in-range) – Shadow

+0

我只是补充说,你需要在你的紧急事件清单和你的日期上产生一个笛卡尔连接以获得完整清单。 – Shadow

+0

发布您的架构或在sqlfiddle.com上创建一个架构 – CiroRa

回答

0

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

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

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分钟是因为我希望它尽可能的接近我所能得到的时间。

# 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' 

这就让:

现在这一种格式,可以让我在Excel中创建一个叠式图(从六月一日至十六日伪造的条目,所以我不得不从本月开始的条目)输出可爱数据我做了这么select我只得到当月导入到Excel:

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

我会这样,如果有人想使用它,他们可以离开这里了这一点,谢谢大家对你的时间和帮助:)

iFr4g

1

您所查询的每urgency产生一个行,因为你这是仅列小组。为了查看每个日期和紧急情况的不同结果,您必须修改GROUP BY。

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; 
+0

关闭,但我需要有没有日期或紧急性的参考日期的紧急情况统计。看到我的架构在这里http://sqlfiddle.com/#!9/715c7 – iFr4g

0

我想这就是你要找的。虽然我没有这个模式,但我试图编写查询。我认为这是你正在寻找的。 (请在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下面将为您目的,我从here获得了一些帮助。您需要优化大数据的查询。

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 
+0

接近我想要的,但它并没有显示返回什么日期,它也显示了上个月的统计数据。请参阅http://pastebin.com/HCUgwG36了解我的数据库的内容。 – iFr4g

+0

修改了我的数据的紧迫性以提供更好的示例http://pastebin.com/hfj8Npwa。架构可以在这里找到http://sqlfiddle.com/#!9/715c7 – iFr4g

+0

我不知道如果你在我发表评论的主要帖子时得到一个提醒,但你认为这将工作@ghkhan?如果我创建一个存储过程来每天晚上查询'glpi_tickets'表,请记录当天记录的总票数及其紧急度,然后将它们存储在名为'COMPANYNAME_TICKETSTATS'的表中。列名将是'DATE','TOTAL_TICKETS','VERY_LOW','LOW','MEDIUM','HIGH','VERY_HIGH',并且他们将具有1,2,3,4的票的总数,当天下面的紧急情况。然后,我会以我需要的格式创建我想要的堆叠图的数据。 – iFr4g