Объединить 2 SQL-запросов в 1 запрос - PullRequest
0 голосов
/ 23 января 2019

У меня сейчас 2 запроса, которые я хочу объединить в 1, если это возможно.

У меня есть открытые билеты, хранящиеся в таблице Tickets_Open, и закрытые билеты в Tickets_Closed.Обе таблицы имеют столбцы «Date_Requested» и «Date_Completed».Мне нужно подсчитывать количество билетов, запрошенных и завершенных каждый день.

Мой запрос запрошенных билетов выглядит следующим образом:

SELECT SUM(Count) AS TotalOpen, Date FROM(
 SELECT COUNT(Ticket_Request_Code) AS Count, Date_Requested AS Date
 FROM Tickets_Closed
 WHERE Date_Requested >='2018-01-01 00:00:00'
 GROUP BY(Date_Requested)
 UNION
 SELECT COUNT(Work_Request_Code) AS Count, Date_Requested AS Date
 FROM Tickets_Open
 WHERE Date_Requested >='2018-01-01 00:00:00'
 GROUP BY(Date_Requested)
) AS t1 GROUP BY Date ORDER BY `t1`.`Date` DESC

Запрос подсчета завершенных моих билетов следующий:

SELECT COUNT(Ticket_Request_Code) AS CountClosed, Date_Completed AS Date
FROM Tickets_Closed
Where Date_Completed >='2018-01-01 00:00:00'
GROUP BY(Date_Completed)

Оба запроса возвращают правильный результат.Для открытия возвращается с заголовками столбцов Date и TotalOpen.Для закрытия он возвращается с заголовками столбцов Date и CountClosed.

Можно ли вернуть его со следующими заголовками столбцов Date, TotalOpen, CountClosed.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

В этом запросе также используется FULL OUTER JOIN на датах, но он правильно складывает счетчики Open / Closed, чтобы получить счетчик TotalOpen.Это также будет обрабатывать возможные значения NULL для случаев, когда у вас есть день, который не закрывает никаких билетов.

WITH open AS 
(
SELECT COUNT(Work_Request_Code) AS OpenCount, Date_Requested AS Date
FROM Tickets_Open
WHERE Date_Requested >='2018-01-01 00:00:00'
GROUP BY(Date_Requested)
)
, close AS
(
SELECT COUNT(Ticket_Request_Code) AS ClosedCount, Date_Requested AS Date
FROM Tickets_Closed
WHERE Date_Requested >='2018-01-01 00:00:00'
GROUP BY(Date_Requested)
)
SELECT
COALESCE(c.Date, o.Date) AS Date
, IFNULL(o.OpenCount, 0) + IFNULL(c.ClosedCount, 0) AS TotalOpen
, IFNULL(c.CountClosed, 0) AS CountClosed
FROM open o
FULL OUTER JOIN closed c ON o.Date = c.Date
0 голосов
/ 23 января 2019

Вы можете объединить их как:

SELECT Date, SUM(isopen) as isopen, SUM(isclose) as isclose
FROM ((SELECT date_requested as date, 1 as isopen, 0 as isclose
       FROM Tickets_Closed
       WHERE Date_Requested >= '2018-01-01'
      ) UNION ALL
      (SELECT date_requested, 1 as isopen, 0 as isclose
       FROM Tickets_Open
       WHERE Date_Requested >= '2018-01-01'
      ) UNION ALL
      (SELECT date_closed as date, 0 as isopen, 1 as isclose
       FROM Tickets_Closed
       WHERE date_closed >= '2018-01-01'
      )
     ) t
GROUP BY Date
ORDER BY Date DESC;

Предполагается, что Ticket_Request_Code и Work_Request_Code не NULL. Если COUNT() действительно используется для проверки значений NULL, добавьте условие к предложению WHERE в каждом подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...