Mam bazę danych biletów wsparcia, powiedzmy, są podzielone na dwie tabele Incidents
, Tasks
.
Incidents
ma pola assigned_group
, open_time
, close_time
Tasks
ma pola assignment
, issue_date
, close_date
(to samo znaczenie, ale różne nazwy)
Teraz potrzebuję skompilować raport o następującej strukturze na określony okres czasu:
Group | Total opened incidents + tasks | Total closed incidents + tasks)
Pojedyncze zapytania wyglądałyby następująco:
-- Q1: Total opened incidents
SELECT assigned_group, COUNT(*) FROM incidents WHERE open_time BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00" GROUP BY assigned_group
-- Q2: Total closed incidents
SELECT assigned_group, COUNT(*) FROM incidents WHERE close_time BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00" GROUP BY assigned_group
-- Q3: Total opened tasks
SELECT assignment, COUNT(*) FROM tasks WHERE issue_date BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00" GROUP BY assignment
-- Q4: Total closed tasks
SELECT assignment, COUNT(*) FROM tasks WHERE close_date BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00" GROUP BY assignment
Tabela wynikowa powinna być
Group | Q1+Q3 | Q2+Q4
Zauważ, że w każdym zapytaniu liczba wierszy (grup) może się różnić, np. żadne zadania nie zostały otwarte w określonym okresie, ale niektóre zadania zostały zamknięte, to jednak powinno być policzone
Dzięki!
Odpowiedzi:
1 dla odpowiedzi № 1Czy mam rację, myśląc, że aby uzyskać sumę Otwartych Incydentów i Zadań, musisz dołączyć do Q1 i Q3 (zakładając assigned_group
i assignment
są ważne dla przyłączenia)? Jeśli tak, następujące podselekcje zwrócą Ci całkowitą liczbę otwartych incydentów
SELECT Incidents.IncidentCount + Tasks.TaskCount AS TotalOpenIncidents ,
COALESCE(Incidents.assigned_group, Tasks.assignment) AS Group
FROM (
SELECT assigned_group, COUNT(*) AS IncidentCount
FROM incidents
WHERE open_time BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assigned_group ) AS Incidents INNER JOIN
(
SELECT assignment, COUNT(*) AS TaskCount
FROM tasks
WHERE issue_date BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assignment) AS Tasks ON Incidents.assigned_group = Tasks.assignment
Musisz zrobić to samo dla Q2 i Q4, aby uzyskać liczbę zamkniętych
0 dla odpowiedzi nr 2
Aby połączyć te dane razem, możesz użyć „pełnego sprzężenia zewnętrznego” lub UNION ALL
. Tutaj jest UNION ALL
metoda:
Istnieją sposoby na zmianę tego zapytania na znacznie prostsze. Jeśli jesteś zainteresowany, mogę ci pokazać więcej lub możesz sam spróbować. Na przykład potrzebujesz tylko 2 zapytań wewnątrz podtabeli Z.
The UNION ALL
metoda zatrzymuje podwójne zliczanie występujące, jeśli twoje kolumny łączące nie są unikalne (chociaż w twoim przypadku nie jest to problem)
SELECT assigned_group, SUM(Closed) As Closed, SUM(Opened) As Opened
FROM
(
SELECT assigned_group, COUNT(*) As Closed, 0 As Opened
FROM incidents
WHERE open_time BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assigned_group
UNION ALL
SELECT assigned_group, 0 As Closed, COUNT(*) As Opened
FROM incidents
WHERE close_time BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assigned_group
UNION ALL
SELECT assignment, 0 As Closed, COUNT(*) As Opened
FROM tasks
WHERE issue_date BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assignment
UNION ALL
SELECT assignment, COUNT(*) As Closed, 0 As Opened
FROM tasks
WHERE close_date BETWEEN "2014-01-01 00:00:00" AND "2014-02-01 00:00:00"
GROUP BY assignment
) Z
GROUP BY assigned_group,