none
SQL Query RRS feed

  • Frage

  • Lieber DB Entwickler/in,

    ich habe ne Query, der mir Folgendes aus gibt:


    Tag stunde Angeboten
    2017-04-01 08:00 3
    2017-04-01 09:00 2
    2017-04-01 10:00 5
    2017-04-01 11:00 6
    2017-04-01 12:00 7

    ich würde gern den Query so umformen dass die summe von zeit von - bis mir aus gibt:

    Tag stunde summe Angeboten
    2017-04-01 08:00 - 09:00 5
    2017-04-01 09:00 - -10:00 7
    2017-04-01 10:00 - 11:00 11
    2017-04-01 11:00 - 12:00 13

    hat jemand ne Idee ?

    Danke

    Fabi

    Freitag, 21. April 2017 08:52

Antworten

  • Hallo Fabi,

    das obige lässt einiges offen:

    Wie wird der Fall behandelt, dass nicht jede Stunde Angebote gemacht werden?

    Sind es immer genau Stunden (oder gibt es auch Minuten, Sekunden)?

    Eine "naive" Lösung (mit einigermaßen aktueller SQL Server Version):

    CREATE TABLE #Angebote  (
    Tag Date NOT NULL,
    Stunde Time NOT NULL,
    Anzahl int NOT NULL)
    
    
    
    INSERT INTO #Angebote(Tag, Stunde, Anzahl) VALUES
    ('2017-04-01', '08:00', 	3),
    ('2017-04-01', '09:00', 	2),
    ('2017-04-01', '10:00', 	5),
    ('2017-04-01', '11:00', 	6),
    ('2017-04-01', '12:00', 	7);
    
    WITH AngebotePartition AS
    (
    	SELECT Tag,
    	  FIRST_VALUE(Stunde) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS Anfang,
    	  LAST_VALUE(Stunde) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS Ende,
    	  SUM(Anzahl) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS AngeboteTotal
    	  FROM #Angebote
    )
    SELECT Tag,
      FORMAT(Anfang, N'hh\:mm') + N' - ' + FORMAT(Ende, N'hh\:mm'),
      AngeboteTotal
    FROM AngebotePartition
    ORDER BY Tag, Anfang;
    GO
    DROP TABLE #Angebote;
    

    Wenn die Rahmenbedingungen abweichen, müsste man einiges vorschalten, wie z. B. zusammenfassen nach Stunden, ggf. Einbindung einer Tabelle, die Bereiche vorgibt usw.

    Gruß Elmar

    Freitag, 21. April 2017 09:43
    Beantworter
  • moin moin stefan, hi Elmar,

    danke für eure Schnelle Antwort.

    Die Anforderung war anscheinend falsch. muss noch mit dem Report warten :-) 

    vielen Dank

    Fabi

    Freitag, 21. April 2017 11:36

Alle Antworten

  • Hi,

    poste bitte die Tabelle als CREATE TABLE Statement, Beispieldaten als INSERT INTO Statement und das auf den Beispieldaten erwünschte Ergebnis.

    Deine SQL Abfrage, die die erste Ausgabe erzeugt, bitte auch.

    Beschreibe auch genau, wie hier gruppiert werden soll. Denn ehrlich gesagt erschließt sich mir nicht, was Du da eigentlich im welcher Form summieren willst. Deine zweite Beispielausgabe ergibt für mich nicht sonderlich viel Sinn.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 21. April 2017 09:23
    Moderator
  • Hallo Fabi,

    das obige lässt einiges offen:

    Wie wird der Fall behandelt, dass nicht jede Stunde Angebote gemacht werden?

    Sind es immer genau Stunden (oder gibt es auch Minuten, Sekunden)?

    Eine "naive" Lösung (mit einigermaßen aktueller SQL Server Version):

    CREATE TABLE #Angebote  (
    Tag Date NOT NULL,
    Stunde Time NOT NULL,
    Anzahl int NOT NULL)
    
    
    
    INSERT INTO #Angebote(Tag, Stunde, Anzahl) VALUES
    ('2017-04-01', '08:00', 	3),
    ('2017-04-01', '09:00', 	2),
    ('2017-04-01', '10:00', 	5),
    ('2017-04-01', '11:00', 	6),
    ('2017-04-01', '12:00', 	7);
    
    WITH AngebotePartition AS
    (
    	SELECT Tag,
    	  FIRST_VALUE(Stunde) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS Anfang,
    	  LAST_VALUE(Stunde) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS Ende,
    	  SUM(Anzahl) OVER (PARTITION BY Tag
    		ORDER BY Tag, Stunde
    		ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS AngeboteTotal
    	  FROM #Angebote
    )
    SELECT Tag,
      FORMAT(Anfang, N'hh\:mm') + N' - ' + FORMAT(Ende, N'hh\:mm'),
      AngeboteTotal
    FROM AngebotePartition
    ORDER BY Tag, Anfang;
    GO
    DROP TABLE #Angebote;
    

    Wenn die Rahmenbedingungen abweichen, müsste man einiges vorschalten, wie z. B. zusammenfassen nach Stunden, ggf. Einbindung einer Tabelle, die Bereiche vorgibt usw.

    Gruß Elmar

    Freitag, 21. April 2017 09:43
    Beantworter
  • moin moin stefan, hi Elmar,

    danke für eure Schnelle Antwort.

    Die Anforderung war anscheinend falsch. muss noch mit dem Report warten :-) 

    vielen Dank

    Fabi

    Freitag, 21. April 2017 11:36