2 SQL-запроса с объединением - PullRequest
       0

2 SQL-запроса с объединением

1 голос
/ 19 сентября 2019

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

Я хочу иметь 6 столбцов для результата ("kunde"), "GesamtdateiGrosse", "anzahlObjGesamt", "GesamtdateiGrossefertig", "anzahlObjFertig" "RestGross") и 2 строки.Тогда RestGross будет разницей между GesamtdateiGrosse и GesamtdateiGrossefertig

SELECT 
    kunde.nummer AS kunde, 
    SUM(datei.groesse) as "GesamtdateiGrosse",
    COUNT (DISTINCT objekt.id) as anzahlObjGesamt
FROM datei 
INNER JOIN  objekt ON datei.id_objekt = objekt.id 
INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id 
INNER JOIN kunde ON auftrag.id_kunde = kunde.id 
WHERE kunde.nummer = 777
GROUP BY kunde.nummer

UNION

SELECT 
    kunde.nummer AS kunde, 
    SUM(datei.groesse) as "GesamtdateiGrossefertig",
    COUNT (DISTINCT objekt.id) as anzahlObjFertig
FROM datei 
INNER JOIN objekt ON datei.id_objekt = objekt.id 
INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id 
INNER JOIN status ON objekt.id_restorestatus = status.id
INNER JOIN kunde ON auftrag.id_kunde = kunde.id 
WHERE status.name = 'fertig' AND kunde.nummer = 777
GROUP BY kunde.nummer 

Я ожидаю, что выходной столбец 3 rown 3 (Kunde, "GesamtdateiGrosse", anzahlObjGesamt)

1 Ответ

0 голосов
/ 19 сентября 2019

Это должно приблизить вас к тому, что вы хотите.Идея состоит в том, чтобы добавить еще одно объединение в первое, чтобы внести в таблицу status и условную агрегацию .

Для этого требуется соотношение 1: 1 между objekt и status (это означает, что для данной записи в objekt всегда есть одна и только одна запись в status, которая удовлетворяет условию objekt.id_restorestatus = status.id).

Рассмотрим:

SELECT
    kunde.nummer AS kunde, 
    SUM(datei.groesse) as "GesamtdateiGrosse",
    COUNT(DISTINCT objekt.id) as anzahlObjGesamt,
    SUM(CASE WHEN status.name = 'fertig' THEN datei.groesse ELSE 0 END) as "GesamtdateiGrossefertig",
    COUNT (DISTINCT (CASE WHEN status.name = 'fertig' THEN objekt.id END)) as anzahlObjFertig
FROM datei 
INNER JOIN objekt ON datei.id_objekt = objekt.id 
INNER JOIN auftrag ON objekt.id_auftrag = auftrag.id 
INNER JOIN kunde ON auftrag.id_kunde = kunde.id 
INNER JOIN status ON objekt.id_restorestatus = status.id
WHERE kunde.nummer = 777
GROUP BY kunde.nummer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...