# 2 Abfragen zusammenfassen



## didi577 (14. Nov 2019)

Hi,

ich habe zwei funktionierende Abfragen die ich gern zu einer performanten Abfrage zusammenfassen würde. Also zwei Abfragen mit je 3 Spalten zu einer Abfrage mit 5 Spalten da Spalte 1 identisch ist. Die ersta Abfrage liefert eine Anzahl je Tag und die zweite Anzahl die Summe der Woche zum ausgewählten Tag.


```
SELECT DISTINCT t.user29, COUNT(t.tnumber) AS Anzahl1, FORMAT(COUNT(t.tnumber)/ (SELECT COUNT(t.tnumber) FROM crmdb.tickets t WHERE t.user22 = 'Planung/Bewirtschaftung' AND t.tnumber LIKE 'HL-%' AND (from_unixtime(t.createtime, '%Y-%m-%d')) = '2019-11-14')*100, 0)AS Anteil1
FROM crmdb.tickets t 
WHERE t.user22 = 'Planung/Bewirtschaftung' 
AND t.tnumber LIKE 'HL-%' 
AND from_unixtime(t.createtime, '%Y-%m-%d') = '2019-11-14' 
GROUP BY t.user29 WITH ROLLUP
;
```
und:

```
SELECT DISTINCT t.user29, COUNT(t.tnumber) AS Anzahl2, FORMAT(COUNT(t.tnumber)/ (SELECT COUNT(t.tnumber) FROM crmdb.tickets t WHERE t.user22 = 'Planung/Bewirtschaftung' AND t.tnumber LIKE 'HL-%' AND (from_unixtime(t.createtime, '%u') = 46) AND (from_unixtime(t.createtime, '%Y')) = 2019)*100, 0) AS Anteil2 
FROM crmdb.tickets t 
WHERE t.user22 = 'Planung/Bewirtschaftung'
AND t.tnumber LIKE 'HL-%'
AND from_unixtime(t.createtime, '%u') = 46
AND from_unixtime(t.createtime, '%Y') = 2019
GROUP BY t.user29 WITH ROLLUP
;
```

wer kann mir helfen ??

Grüße


----------



## didi577 (14. Nov 2019)

Ich habe einen Lösungsweg gefunden:

```
SELECT DISTINCT t.user29, IFNULL(e.Anzahl1, 0), IFNULL(e.Anteil1, 0), IFNULL(d.Anzahl2, 0), IFNULL(d.Anteil2, 0)
FROM crmdb.tickets t 
LEFT JOIN (SELECT DISTINCT t.user29, COUNT(t.id) AS Anzahl1, FORMAT(COUNT(t.id)/ (SELECT COUNT(t.id) FROM crmdb.tickets t WHERE t.user22 = 'Planung/Bewirtschaftung' AND t.tnumber LIKE 'HL-%' AND (from_unixtime(t.createtime, '%Y-%m-%d')) = '2019-11-11')*100, 0)AS Anteil1
FROM crmdb.tickets t 
WHERE t.user22 = 'Planung/Bewirtschaftung' 
AND t.tnumber LIKE 'HL-%' 
AND from_unixtime(t.createtime, '%Y-%m-%d') = '2019-11-11' 
GROUP BY t.user29) e ON e.user29 = t.user29
right JOIN (SELECT DISTINCT t.user29, COUNT(t.id) AS Anzahl2, FORMAT(COUNT(t.id)/ (SELECT COUNT(t.id) FROM crmdb.tickets t WHERE t.user22 = 'Planung/Bewirtschaftung' AND t.tnumber LIKE 'HL-%' AND (from_unixtime(t.createtime, '%u') = 46) AND (from_unixtime(t.createtime, '%Y')) = 2019)*100, 0) AS Anteil2 
FROM crmdb.tickets t 
WHERE t.user22 = 'Planung/Bewirtschaftung'
AND t.tnumber LIKE 'HL-%'
AND from_unixtime(t.createtime, '%u') = 46
AND from_unixtime(t.createtime, '%Y') = 2019
GROUP BY t.user29) d ON d.user29 =t.user29
GROUP BY t.user29
;
```

jetzt habe ich nur das Problem "WITH ROLLUP" richtig zu setzen, damit ich unter jeder Spalte eine Summe bekomme. Wie kann ich das erreichen?


----------



## Meniskusschaden (14. Nov 2019)

Nur mal so als grundsätzliche Überlegung:

Du hattest hier ja schon häufiger ähnliche Anfragen. Es scheint immer um das Thema Reporting für dieselben Tabellen zu gehen. Die Abfragen werden teilweise recht umständlich, Performanceprobleme spielen eine Rolle und die fehlende Möglichkeit, die Datenbank anzupassen oder Indizes zu erstellen, schränkt dich zusätzlich ein.

Vielleicht solltest du in Erwägung ziehen, die Daten einfach in ein Data Warehouse zu überführen und das Reporting dort zu machen. Wahrscheinlich könntest du deine Probleme dadurch grundsätzlich lösen, anstatt immer wieder neu herum zu frickeln.


----------



## didi577 (14. Nov 2019)

das ist sicher eine gute Alternative, da müsste ich mich aber auch erst noch einarbeiten

mir geht es hier aber auch um das erlernen des grundsätzlichen "Handwerks", da ich nicht regelmäßig daran arbeite fehlt mir  die Routine


----------



## Meniskusschaden (14. Nov 2019)

didi577 hat gesagt.:


> mir geht es hier aber auch um das erlernen des grundsätzlichen "Handwerks"


Dann wäre es vielleicht nicht schlecht, diesem Vorschlag aus einem deiner anderen Threads zu folgen:


Thallius hat gesagt.:


> Oder der TO bastelt schnell ein sqlFiddle aus seinen Tabellen. Dann wird es für uns auch viel leichter.


Wenn du dort ein aussagekräftiges Beispiel mit ein paar Testdaten aufbaust und hier verlinkst, steigerst du die Bereitschaft hier zu antworten erheblich.


----------



## didi577 (17. Nov 2019)

Voila

http://sqlfiddle.com/#!9/369c2a/19/0 

mein Ziel ist es unter den Vier Spalten mit Werten eine Summe darzustellen

wenn ich WITH ROLLUP hinter das letzte GROUP BY setze kommen nicht die richtigen Werte


----------



## mihe7 (17. Nov 2019)

```
SELECT Bereiche, sum(AnzahlTag) AS AnzahlTag, sum(AnteilTag) AS AnteilTAg, sum(AnzahlWoche) AS AnzahlWoche, sum(AnteilWoche) AS AnteilWoche
FROM (
SELECT t.user29 AS Bereiche, (IFNULL(e.Anzahl1, 0)) AS AnzahlTag, (IFNULL(e.Anteil1, 0)) AS AnteilTag, (IFNULL(d.Anzahl2, 0)) AS AnzahlWoche, (IFNULL(d.Anteil2, 0)) AS AnteilWoche
FROM tickets t 
  LEFT JOIN (SELECT DISTINCT t.user29, COUNT(t.tnumber) AS Anzahl1, FORMAT(COUNT(t.tnumber)/ (SELECT COUNT(t.tnumber) FROM tickets t WHERE t.user22 = 'Planung' AND t.tnumber LIKE 'HL-%' AND createtime = '2019-11-14')*100, 0)AS Anteil1
    FROM tickets t 
    WHERE t.user22 = 'Planung' 
      AND t.tnumber LIKE 'HL-%' 
      AND createtime = '2019-11-14' 
    GROUP BY t.user29) e ON e.user29 = t.user29
  right JOIN (SELECT DISTINCT t.user29, COUNT(t.tnumber) AS Anzahl2, FORMAT(COUNT(t.tnumber)/ (SELECT COUNT(t.tnumber) FROM tickets t WHERE t.user22 = 'Planung' AND t.tnumber LIKE 'HL-%' AND WEEKOFYEAR(t.createtime) = 46 AND YEAR(t.createtime) = 2019)*100, 0) AS Anteil2 
    FROM tickets t 
    WHERE t.user22 = 'Planung'
    AND t.tnumber LIKE 'HL-%'
    AND WEEKOFYEAR(t.createtime) = 46
    AND YEAR(t.createtime) = 2019
    GROUP BY user29) d ON d.user29 = t.user29
GROUP BY t.user29
) x GROUP BY Bereiche WITH ROLLUP
```


----------



## didi577 (17. Nov 2019)

vielen Dank


----------

