Select für mehrere Abfragen

Mirko Böstro

Benutzer
Beiträge
12
Hallo Leute,

ich brauch dringend Hilfe!!!

Muss dringend eine Abfrage erstellen, analog dieser.

Code:
SELECT
  SUM(TB_Verluste.Verlust) AS Verlust,
  TB_Stoerarten.Kuerzel,
  month(TB_Verluste.Zeit) AS Monat
  FROM
  (((dbo.TB_Anlagen INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
  INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
  INNER JOIN dbo.TB_Schichten ON dbo.TB_Verluste.Schicht = dbo.TB_Schichten.[Key])
  INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key]
  WHERE (
  TB_Verluste.Zeit BETWEEN '2015-01-01 06:30:00' and '2015-08-05 06:30:00'  and
  TB_FAs.Bezeichnung like 'FA 07.1' AND TB_Stoerarten.Kuerzel = 'IA')
  GROUP BY month(TB_Verluste.Zeit), TB_Stoerarten.Kuerzel


Nun ist aber das Problem, das ich anstelle "TB_Stoerarten.Kuerzel = 'IA'" noch einige weitere Kuerzel habe, die ich abfragen muss.

Das Ergebnis sollte dann in etwa so aussehen:

Monat|Verlust_IA|Verlust_IF|Verlust_P|Verlust_Q|Verlust_xxx|Verlust_xxx
1 |5 |3 |7 |9 |1 |8
2 |11 |13 |9 |3 |5 |1

Ich hoffe, Ihr könnt mir helfen, denn ich habe keine Ahnung, wie ich das anstellen soll.
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
TB_FAs.Bezeichnung like 'FA 07.1' AND TB_Stoerarten.Kuerzel = 'IA')

GROUP BY month(TB_Verluste.Zeit), TB_Stoerarten.Kuerzel


Nun ist aber das Problem, das ich anstelle "TB_Stoerarten.Kuerzel = 'IA'" noch einige weitere Kuerzel habe, die ich abfragen muss.

Vielleicht suchst Du ein IN (...), aber das ist nur eine Vermutung, basierend auf dem, was wir wissen.
 
Hallo

sorry, wenn es nicht verständlich war.

Mit dem SQL (mit "IN")

Code:
SELECT
       SUM(TB_Verluste.Verlust) AS Verlust,
       TB_Stoerarten.Kuerzel,
       month(TB_Verluste.Zeit) AS Monat
       FROM
       (((dbo.TB_Anlagen INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
       INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
       INNER JOIN dbo.TB_Schichten ON dbo.TB_Verluste.Schicht = dbo.TB_Schichten.[Key])
       INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key]
       WHERE (
       TB_Verluste.Zeit BETWEEN '2015-01-01 06:30:00' and '2015-08-05 06:30:00'  and
       TB_FAs.Bezeichnung like 'FA 07.1' AND TB_Stoerarten.Kuerzel IN ('IA', 'IF', 'P', 'BV'))
       GROUP BY month(TB_Verluste.Zeit), TB_Stoerarten.Kuerzel

bekomme ich folgende Ergebnisse.

upload_2015-5-11_15-41-56.png

Ich benötige aber für die Summe für "BV" eine Ergebnisspalte, für die Summe " IA" eine Spalte, etc.
Dazu kommt noch, das nicht jedes "Kuerzel" einen Wert hat.
 
Zuletzt bearbeitet von einem Moderator:
Hallo Leute,

der Tip von akretschmer war schon mal Gold wert.

Habe jetzt mit folgenden SQL die Daten in Spalten als Ergebnis.

Code:
SELECT [Monat], [Jahr],  [BV], [AT], [AQ], [IF], [K], [LO], [P], [PA], [Q], [TG], [TK], [VL], [IA], [SY]
FROM (
   SELECT Month(TB_Verluste.Zeit) AS Monat, YEAR(TB_Verluste.Zeit) AS Jahr, TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
  FROM ((dbo.TB_Anlagen INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
       INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
       INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key]
       WHERE (
       TB_Verluste.Zeit BETWEEN '2015-01-01 06:30:00' and '2015-08-05 06:30:00' and
       TB_FAs.Bezeichnung like 'FA 07.1')
   GROUP BY Month(TB_Verluste.Zeit), YEAR(TB_Verluste.Zeit), TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
   ) AS SourceTable
PIVOT (
SUM(Verlust) FOR Kuerzel IN (
[BV], [AT], [AQ], [IF], [K], [LO], [P], [PA], [Q], [TG], [TK], [VL], [IA], [SY])
) AS PivotTable

Jetzt ist aber noch das Problem, das ich pro "Stoerart" und "Monat" auch eine Zeile bekomme.
Hätte schon gerne eine Zeile / Monat, mit allen Verlusten.
Die "GROUP BY"-Anweiung bringt an der Stelle leider nichts. Hat hier jemand noch ne Idee???

upload_2015-5-12_18-21-47.png
 
Zuletzt bearbeitet von einem Moderator:
Vielen Danke für die Super-Tipps!!

Habe es jetzt geschafft, Dank Deiner Hilfe!!!!

Das Ergebnis sieht jetzt so aus, wie ich es brauche!!!

upload_2015-5-13_9-49-13.png

Der SQL sieht jetzt so aus:
Code:
SELECT [Monat] AS MONAT, [Jahr] AS JAHR, SUM(coalesce([BV],0)) AS BV, SUM(coalesce([AT],0)) AS AT, SUM(coalesce([AQ], 0)) AS AQ, SUM(coalesce([IF], 0)) AS 'IF', SUM(coalesce([K], 0)) AS K, SUM(coalesce([LO], 0)) AS LO,
     SUM(coalesce([P], 0)) AS P, SUM(coalesce([PA], 0)) AS PA, SUM(coalesce([Q], 0)) AS Q, SUM(coalesce([TG], 0)) AS TG, SUM(coalesce([TK], 0)) AS TK, SUM(coalesce([VL], 0)) AS VL, SUM(coalesce([IA], 0)) AS IA,
     SUM(coalesce([SY], 0)) AS SY
FROM (
   SELECT Month(TB_Verluste.Zeit) AS Monat, YEAR(TB_Verluste.Zeit) AS Jahr, TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
  
  FROM ((dbo.TB_Anlagen INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
       INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
       INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key]
       WHERE (
       TB_Verluste.Zeit BETWEEN '2015-01-01 06:30:00' and '2015-13-05 06:30:00' and
       TB_FAs.Bezeichnung like 'FA 07.1')
   ) AS SourceTable
PIVOT (
SUM(Verlust) FOR Kuerzel IN (
[BV], [AT], [AQ], [IF], [K], [LO], [P], [PA], [Q], [TG], [TK], [VL], [IA], [SY])
) AS PivotTable
Group BY MONAT, JAHR


Vielen Dank nochmal!!!!!
 
Zuletzt bearbeitet von einem Moderator:
Hallo Leute,

hab da mal ein Problem.
Der SQL muss stetig erweitert werden, da immer mehr Spalten dazu kommen sollen.
Hier wäre das Stichwort "Dynamische Pivot"

Ich hab davon leider überhaupt keine Ahnung, geschweige sehe ich bei der Dynamik durch..

Wer kann mir hier helfen?! Wäre wirklich wichtg!!!

Der SQL sieht derzeit so aus:

Code:
Use Ausbringungsverluste
SELECT [Datum] AS Datum, SUM(coalesce([IA], 0)) AS IA, SUM(coalesce([IF], 0)) AS 'IF', SUM(coalesce([IT], 0)) AS IT, SUM(coalesce([P], 0)) AS P, SUM(coalesce([PA], 0)) AS PA, SUM(coalesce([PT], 0)) AS PT, SUM(coalesce([PB], 0)) AS PB, SUM(coalesce([LO], 0)) AS LO, SUM(coalesce([LS], 0)) AS LS, SUM(coalesce([KF], 0)) AS KF, SUM(coalesce([KS], 0)) AS KS, SUM(coalesce([KR], 0)) AS KR, SUM(coalesce([KA], 0)) AS KA, SUM(coalesce([DM], 0)) AS DM, SUM(coalesce([DK], 0)) AS DK, SUM(coalesce([DL], 0)) AS DL, SUM(coalesce([S], 0)) AS S
FROM (SELECT TB_Schichten.Datum AS Datum, TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
        FROM (((dbo.TB_Anlagen
                INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
                INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
                INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key] )
                INNER JOIN dbo.TB_Schichten ON dbo.TB_Verluste.Schicht = dbo.TB_Schichten.[Key]
        WHERE (TB_Verluste.Zeit BETWEEN CONVERT(DATETIME, '02.07.2018', 104) AND CONVERT(DATETIME, '07.07.2018', 104)
                and TB_FAs.Bezeichnung like 'FA 09.3') ) AS SourceTable
PIVOT ( SUM(Verlust) FOR Kuerzel IN ( [IA], [IF], [IT], [P], [PA], [PT], [PB], [LO], [LS], [KF], [KS], [KR], [KA], [DM], [DK], [DL], [S]) ) AS PivotTable
Group BY Datum


Ich Danke schon mal für die Hilfe!!!
 
Das ist so das Problem mit Spalten die eigentlich keine sein sollten :)

Dynamisches SQL suchst du und das geht in etwa so:
Du deklarierst eine Variable VARCHAR(8000) oder so. Du baust dir deinen SELECT Stück für Stück in dieser Variable zusammen. Das was nicht statisch ist, also die Liste deiner Spalten, ergänzt du mit SQL zu deiner Variablen. Am Ende führst du mit EXEC(@Variable) den ganzen Salat aus und hoffst das kein schwarzes Loch entsteht.
 
Werbung:
Das ist so das Problem mit Spalten die eigentlich keine sein sollten :)

Dynamisches SQL suchst du und das geht in etwa so:
Du deklarierst eine Variable VARCHAR(8000) oder so. Du baust dir deinen SELECT Stück für Stück in dieser Variable zusammen. Das was nicht statisch ist, also die Liste deiner Spalten, ergänzt du mit SQL zu deiner Variablen. Am Ende führst du mit EXEC(@Variable) den ganzen Salat aus und hoffst das kein schwarzes Loch entsteht.


Hab ein Beispiel gefunden, womit ich schon etwas weiter gekommen bin.

Code:
USE Ausbringungsverluste

DECLARE @startdatum Date;
DECLARE @enddatum Date;
DECLARE @FA nvarchar(100);

SET @startdatum = '02.07.2018'
SET @enddatum = '07.07.2018'
SET @FA = 'FA 09.3'

DECLARE @X varchar(8000);
DECLARE @S varchar(20);
DECLARE @ERSTER int;
DECLARE C CURSOR
FOR SELECT TB_Stoerarten.Kuerzel FROM TB_Stoerarten WHERE TB_Stoerarten.deaktiviert is null Order by sortOrder;

SET @X = 'SELECT [Datum] AS Datum, (SELECT TB_Stoerarten.Kuerzel FROM TB_Stoerarten WHERE TB_Stoerarten.deaktiviert is null )'
SET @X = @X + 'FROM (SELECT TB_Schichten.Datum AS Datum, TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
        FROM (((dbo.TB_Anlagen
                INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
                INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
                INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key] )
                INNER JOIN dbo.TB_Schichten ON dbo.TB_Verluste.Schicht = dbo.TB_Schichten.[Key]
        WHERE (TB_Verluste.Zeit BETWEEN CONVERT(DATETIME, ''02.07.2018'', 104) AND CONVERT(DATETIME, ''02.07.2018'', 104)
                and TB_FAs.Bezeichnung like ''FA 09.3''))  AS SourceTable '
SET @X = @X + 'PIVOT ( SUM(Verlust) FOR Kuerzel IN ('

  SET @ERSTER = -1;

  OPEN C;
 
  FETCH C INTO @S;

  WHILE (@@FETCH_STATUS=0)
  BEGIN
    IF @Erster = -1
      set @Erster = 0;
    ELSE
      SET @X = @X + ', ';

    SET @X = @X + '[' + @S + ']';

    FETCH C INTO @S;
  END

  CLOSE C
  DEALLOCATE C

SET @X = @X + ')) AS PivotTable '
SET @X = @X + 'Group BY Datum'

PRINT @X
EXECUTE (@X);


Der SQL sieht dann schon mal so aus:

Code:
SELECT [Datum] AS Datum, (SELECT TB_Stoerarten.Kuerzel FROM TB_Stoerarten WHERE TB_Stoerarten.deaktiviert is null )
FROM (SELECT TB_Schichten.Datum AS Datum, TB_Verluste.Verlust, TB_Verluste.Stoerart, TB_Stoerarten.Kuerzel
        FROM (((dbo.TB_Anlagen
                INNER JOIN dbo.TB_Verluste ON dbo.TB_Anlagen.[Key] = dbo.TB_Verluste.Anlage)
                INNER JOIN dbo.TB_Stoerarten ON dbo.TB_Verluste.Stoerart = dbo.TB_Stoerarten.Stoerart_ID)
                INNER JOIN dbo.TB_FAs ON dbo.TB_Anlagen.FAID = dbo.TB_FAs.[Key] )
                INNER JOIN dbo.TB_Schichten ON dbo.TB_Verluste.Schicht = dbo.TB_Schichten.[Key]
        WHERE (TB_Verluste.Zeit BETWEEN CONVERT(DATETIME, '02.07.2018', 104) AND CONVERT(DATETIME, '02.07.2018', 104)
                and TB_FAs.Bezeichnung like 'FA 09.3'))  AS SourceTable
PIVOT ( SUM(Verlust) FOR Kuerzel IN ([IA], [IF], [IT], [IP], [P], [PA], [PB], [PT], [LO], [LX], [ZU], [AB], [KA], [KF], [KI], [KR], [KS], [KT], [DB], [DI], [DK], [DL], [DM], [S])) AS PivotTable
Group BY Datum

Wie bekomme ich jetzt aber die erste Zeile im SQL umgesetzt?
Also das "SUM(coalesce([xx], 0)) AS xx, SUM(coalesce([yy], 0)) AS yy, SUM(coalesce([zz], 0)) AS zz,...".
Siehe #10

Code:
SELECT [Datum] AS Datum, SUM(coalesce([IA], 0)) AS IA, SUM(coalesce([IF], 0)) AS 'IF', SUM(coalesce([IT], 0)) AS IT, SUM(coalesce([P], 0)) AS P, SUM(coalesce([PA], 0)) AS PA, SUM(coalesce([PT], 0)) AS PT, SUM(coalesce([PB], 0)) AS PB, SUM(coalesce([LO], 0)) AS LO, SUM(coalesce([LS], 0)) AS LS, SUM(coalesce([KF], 0)) AS KF, SUM(coalesce([KS], 0)) AS KS, SUM(coalesce([KR], 0)) AS KR, SUM(coalesce([KA], 0)) AS KA, SUM(coalesce([DM], 0)) AS DM, SUM(coalesce([DK], 0)) AS DK, SUM(coalesce([DL], 0)) AS DL, SUM(coalesce([S], 0)) AS S
 
Zurück
Oben