SQL Bestimmte Ergebnisse summieren

aggitron

Commander
Registriert
Jan. 2006
Beiträge
2.074
Hallo,

ich bekomme mit dieser Abfrage:

SQL:
SELECT COUNT(DISTINCT t1.nummer) AS Anzahl, t1.typ AS Typ, t2.einheit AS Einheit
FROM tabelle1 AS t1
JOIN tabelle2 AS t2
ON t1.nummer = t2.nummer
GROUP BY t1.typ, t2.einheit
ORDER BY t2.einheit

dieses Ergebnis:

AnzahlTypEinheit
2typ_aTest1
5typ_bTest1
6typ_cTest1
4typ_dTest1

Wie kann ich jetzt den Typ b,c und d in einer Zeile summieren? Wunschergebnis:
AnzahlTypEinheit
2typ_aTest1
15typ_b, typ_c, typ_d (oder Alias)Test1
 
Hi aggitron,

dass kommt darauf an welches Datenbanksystem du nutzt.
mysql kennt dafür GROUP_CONCAT:
Code:
SELECT
   COUNT(DISTINCT t1.nummer) AS Anzahl
  ,GROUP_CONCAT(DISTINCT t1.typ
                ORDER BY t1.typ
                SEPARATOR ',') AS Typ
  ,t2.einheit AS Einheit
FROM tabelle1 AS t1
LEFT JOIN tabelle2 AS t2
                  ON t1.nummer = t2.nummer
GROUP BY t2.einheit
ORDER BY t2.einheit
 
Musst du noch wissen, aus welchen Typen das zweite Ergebnis besteht?

Ansonsten würde ich es mit einer Subquery machen und die Typen für das Gruppieren zusammenfassen.
SQL:
DECLARE @Tabelle1 AS TABLE(Nummer int, Typ nvarchar(max))
DECLARE @Tabelle2 AS TABLE(Nummer int, Einheit nvarchar(max))

INSERT INTO @Tabelle1
VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'B'), (5, 'C')

INSERT INTO @Tabelle2
VALUES(1, 'Test1'),(2, 'Test1'),(3, 'Test1'),(4, 'Test1'),(5, 'Test1')


SELECT COUNT(X.Nummer) AS Anzahl
, x.Einheit
, x.GroupIndicator
FROM (
    SELECT t1.Nummer
    , t2.Einheit
    , CASE WHEN t1.Typ = 'A' THEN 1 ELSE 2 END AS GroupIndicator
    FROM @Tabelle1 t1
    INNER JOIN @Tabelle2 t2 ON t1.Nummer = t2.Nummer
) X
GROUP BY x.Einheit, x.GroupIndicator

Ergebnis

AnzahlEinheitGroupIndicator
1Test11
4Test12
 
Zuletzt bearbeitet: (Beispiel)
Dies lässt sich mit LISTAGG lösen.
 
Und welche mssql-version?

Ab 2003(?) funktioniert es per "FOR XML PATH".
Mit Stuff() könnte noch das letzte Komma entfernt werden.

Code:
SELECT
   COUNT(DISTINCT t1.nummer) AS Anzahl
, CAST((
          SELECT  T1x.typ+','
          FROM tabelle1 T1x
          WHERE t1.typ = T1x.typ
          FOR XML PATH(''))as varchar(500)) as Typen
,t2.einheit AS Einheit
FROM tabelle1 AS t1
LEFT JOIN tabelle2 AS t2
                  ON t1.nummer = t2.nummer
GROUP BY t2.einheit
ORDER BY t2.einheit

mssql 2017 kennt string_agg
Code:
SELECT
   COUNT(DISTINCT t1.nummer) AS Anzahl
, STRING_AGG(t1.typ, ',') WITHIN GROUP (ORDER BY t1.typ) AS typen
  ,t2.einheit AS Einheit
FROM tabelle1 AS t1
LEFT JOIN tabelle2 AS t2
                  ON t1.nummer = t2.nummer
GROUP BY t2.einheit
ORDER BY t2.einheit
Ergänzung ()

Nexialist. schrieb:
Dies lässt sich mit LISTAGG lösen.
Ja, bei Oracle / DB2.
Der Fragesteller verwendet aber einen MsSql-Server.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Nexialist. und quaaaak
@user2342, war ja nur ein Hint, man kann einfach nach LISTAGG MSSQL suchen und landet gleich auf einer sof-Seite, wo genau dies vorgeschlagen wird, was du schreibst (STRING_AGG, STUFF()).
 
  • Gefällt mir
Reaktionen: user2342
Zurück
Oben