/ / Zapytanie SQL łącz raport z różnych tabel - sql, sql-server-2008

Zapytanie SQL łączy raport z różnych tabel - sql, sql-server-2008

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 № 1

Czy 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,