2016-06-14 10 views
1

ich einige Berichte erstellen möchten, so dass ich unsere Helpdesk schnell in Bezug auf Daten packen, ich GLPI verwende, die auf MySQL 5.5 ausgeführt wirdRückgabewerte, selbst wenn null, 0 oder nicht vorhanden

ich den Code unten und es gibt einige nützliche Informationen zurück, aber nicht genug, so dass es in ein ziemlich gestapeltes Diagramm eingefügt werden kann, was er angefordert hat. Um genügend Daten zu bekommen, um dies zu erreichen, brauche ich die Dringlichkeit, die Null sind und die Tage, die auch Null sind, dann kann ich die Daten in eine Tabelle in Excel umwandeln und das Diagramm erstellen.

Aktuelle Abfrage:

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; 

Das gibt:

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

ich ideal wäre, wie es wie unten angezeigt:

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

Und so weiter.

Ich bin irgendwie den Hang von SQL (Selbstunterricht) so alle und jede Hilfe wird sehr geschätzt.

EDIT: Schema hinzugefügt, ich denke, das ist, was Sie fragte (hoffe, es funktioniert) http://sqlfiddle.com/#!9/715c7

+2

Mögliches Duplikat [MySQL, wie in Bereich fehlen Daten zu füllen?] (Http://stackoverflow.com/questions/3538858/mysql-how-to-fill-missing-dates-in-range) – Shadow

+0

Ich füge nur hinzu, dass Sie einen Kartesischen Join auf Ihrer Dringlichkeitsliste und Ihre Daten erstellen müssen, um die vollständige Liste zu erhalten. – Shadow

+0

posten Sie Ihr Schema oder erstellen Sie eine auf sqlfiddle.com – CiroRa

Antwort

0

So ist das, was ich tun beendet und es erscheint nur die Daten liefern werden, wie ich es will.

Zunächst einmal habe ich eine neue Tabelle in der die Daten gespeichert werden:

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)); 

Dann baute ich eine gespeicherte Prozedur zu sammeln und die Daten zu füllen:

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 ; 

ich dieses Verfahren dann eingestellt um jede Stunde zu laufen, so sind die Statistiken neulich, wenn mein Manager sich tagsüber auf sie beziehen will (ich trat direkt auf das mysql Serverterminal):

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

Die 29 Minuten sind, weil ich wollte, dass sie so nah wie möglich an der Zeit laufen.

gibt diese nun schöne Daten in einem Format, das mir ein gestapeltes Diagramm in Excel erstellen kann (Gefälschte Einträge aus Juni 01-16 so hatte ich Einträge von Anfang des Monats):

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

Dies läßt dann mir einen select so werde ich nur den aktuellen Monat in Excel importiert:

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

ich das hier verlassen werde also, wenn jemand will, es zu benutzen, sie können, dankt allen für Ihre Zeit und helfen :)

012.351.

iFr4g

1

Ihre Abfrage erzeugt eine Zeile pro urgency, weil Sie nur nach dieser Spalte Gruppe. Um für jedes Datum und jede Dringlichkeit eindeutige Ergebnisse zu sehen, müssen Sie Ihre GROUP BY ändern.

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

Schließen, aber ich brauche die Dringlichkeitsstatistiken für Daten, wo es keine Referenz des Datums oder der Dringlichkeit gibt. Sehen Sie mein Schema hier http://sqlfiddle.com/#!9/715c7 – iFr4g

0

Ich denke, das ist, was Sie suchen. Obwohl ich das Schema nicht hatte, versuchte ich, die Abfrage zu schreiben. Ich denke, das ist es wonach Sie suchen. (Bitte überprüfen Sie die SQL, ich habe bearbeitet werden. Es sollte einen Bericht wie erzeugen, wie Sie wollen, nur fehlende Datensätze sind, wenn es keine Daten für ein Datum ist.)

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 

ich die folgenden SQL erraten wird dazu dienen, Ihre Zweck, nahm ich ein wenig Hilfe von here. Sie müssen die Abfrage für Big Data optimieren.

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

Nah an, was ich will, aber es zeigt nicht jedes Datum in, was zurückgebracht wird, es zeigt auch Statistiken vom letzten Monat an. Siehe http://pastebin.com/HCUgwG36 für was aus meiner Datenbank kam. – iFr4g

+0

Modifizierte die Dringlichkeit meiner Daten, um ein besseres Beispiel zu geben http://pastebin.com/hfj8Npwa. Schema kann hier gefunden werden http://sqlfiddle.com/#!9/715c7 – iFr4g

+0

Ich habe keine Ahnung, wenn Sie eine Warnung erhalten, wenn ich den Hauptbeitrag kommentieren aber denken Sie, dass dies @ghkhan funktionieren würde? Wenn ich eine gespeicherte Prozedur erstelle, um die Tabelle "glpi_tickets" jede Nacht abzufragen, nimm die Gesamtzahl der an diesem Tag geloggten Tickets und ihre Dringlichkeiten auf und speichere sie in einer Tabelle mit dem Namen 'COMPANYNAME_TICKETSTATS'. Spaltennamen wären "DATE", "TOTAL_TICKETS", "VERY_LOW", "LOW", "MEDIUM", "HIGH", "VERY_HIGH" und sie hätten die Gesamtzahl der Tickets mit 1,2,3,4, 5 Dringlichkeit darunter für diesen Tag. Dann hätte ich die Daten, die ich in dem Format haben möchte, das ich brauche, um ein gestapeltes Diagramm zu erstellen, denke ich. – iFr4g

Verwandte Themen