Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Select für mehrere Abfragen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Mirko Böstro, 10 Mai 2015.

  1. Mirko Böstro

    Mirko Böstro Benutzer

    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 von einem Moderator bearbeitet: 10 Mai 2015
  2. akretschmer

    akretschmer Datenbank-Guru

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

    Distrilec Datenbank-Guru

    Geht mir genauso... Nur ich weiß nichteinmal WAS ich "anstellen" soll...
     
  4. Mirko Böstro

    Mirko Böstro Benutzer

    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 von einem Moderator bearbeitet: 11 Mai 2015
  5. akretschmer

    akretschmer Datenbank-Guru

    Das ist alles schlecht, Du kennst nicht die Anzahl der resultierenden Spalten. Suche nach Pivot für Deine DB.
     
  6. Mirko Böstro

    Mirko Böstro Benutzer

    Das ist glaube ich, was ich brauche! Ich werde mich mal daran versuchen!!!

    Danke Dir schon mal für den Tip!!!!
     
  7. Mirko Böstro

    Mirko Böstro Benutzer

    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 von einem Moderator bearbeitet: 12 Mai 2015
  8. akretschmer

    akretschmer Datenbank-Guru

    Ich weiß ;-)

    Zu Deiner Frage: Summieren und nach Monat und Jahr gruppieren.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Ach so: Du brauchst noch Coalesce(). Ich denke, Du schaffst das nun.
     
  10. Mirko Böstro

    Mirko Böstro Benutzer

    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 von einem Moderator bearbeitet: 13 Mai 2015
    ukulele und Distrilec gefällt das.
  11. Mirko Böstro

    Mirko Böstro Benutzer

    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!!!
     
  12. akretschmer

    akretschmer Datenbank-Guru

    siehe #5 ;-)
     
  13. Mirko Böstro

    Mirko Böstro Benutzer

    Das mit der Pivot-Tabelle funktioniert ja, aber wie kann ich die Spalten dynamisieren?
    Da benötige ich einen großen Denkanstoß!!! :)

    upload_2018-7-7_16-5-36.png
     
  14. ukulele

    ukulele Datenbank-Guru

    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.
     
    Walter gefällt das.
  15. Mirko Böstro

    Mirko Böstro Benutzer


    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden