2016-06-14 8 views
1

Я хочу создать несколько отчетов, так что я могу получить данные быстро в отношении нашей службы поддержки, я использую GLPI, который работает на MySQL 5.5Возвращаемые значения, даже если нуль, 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 (самообучение), поэтому всякая и всякая помощь очень ценится.

EDIT: Schema добавил, я думаю, что это то, что ты просил (надеюсь, что он работает) 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 минут, потому что я хотел, чтобы он работал как можно ближе к часу, когда я мог его получить.

Теперь это выводит прекрасные данные в формате, который позволяет мне создать многослойный график в Excel (фальсифицировано запись из первой 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

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, 5 срочность для этого дня. Тогда у меня были бы данные, которые я хочу, в формате, который мне нужен, чтобы создать сложный граф, который я думаю. – iFr4g