Frage

Ich habe die folgende Tabelle erstellt (über UNION ALL):

ID        Date         Hour   Weight    Fiscal
AAA       1/27/2009     0      10         0
AAA       1/30/2009     0      20         0
AAA       2/14/2009     0      10         0
AAA       2/18/2009     0      20         0
AAA       2/27/2009     0      20         0
AAA       2/28/2009     0      20         0
AAA       1/14/2009     10     0          0
AAA       2/14/2009     20     0          0
AAA       2/16/2009     10     0          0
AAA       2/25/2009     10     0          0
AAA       2/26/2009     10     0          0
AAA       3/3/2009          20     0          0
NULL          0                 0      0          1/28/2009
NULL          0                 0      0          2/27/2009
NULL          0                 0      0          3/29/2009

Und ich möchte abzurufen:

    ID      Date        Hour    Weight
    AAA     1/28/2009   10  10
    AAA     2/27/2009   50  50
    AAA     3/29/2009   20  20

Es soll zuerst das Datum Spalt zum nächsten Fiscal Monatsende FISCAL konvertieren (zB 2007.01.27 -> 2009.01.28, 2009.01.30 -> 2009.02.27, etc.) und dann die Gruppe durch diesen Wert.

Ich war in der Lage zu verwenden:

    SELECT  ID
    ,       left(CONVERT(VARCHAR(10)
    ,       date, 111),7) as Date
    ,       round(sum(Hours),0) as Hours
    ,       round(sum(Weight),0) as Weight
    FROM    ...
    GROUP   BY ID
    ,       left(CONVERT(VARCHAR(10), date, 111),7)
    ORDER   by ID ASC
    ,       left(CONVERT(VARCHAR(10), date, 111),7) ASC

Aber, dass nur Gruppen von Kalender Daten, nicht nach dem Fiscal Monat endet Ich habe in der FISCAL Spalte.

War es hilfreich?

Lösung

Sie sollten die Geschäftsdaten in der Tabelle nicht union. Aber mit dem Tisch, wie Sie jetzt haben, könnten Sie zunächst eine Tabelle erstellen (unter Verwendung von MIT, so dass keine speziellen Privilegien erforderlich sind) mit dem Geschäft ‚Zeiten‘ und verbinden Sie diese Tabelle mit Ihrer Haupttabelle.

Ich rief Ihre Tabelle SO. Ich hatte auch Ihre Spalten Chour und CDate weil in Oracle mindestens Datum ist ein reserviertes Wort zu benennen. Sie könnten sehr wohl die Tabelle ‚main‘ erstellen und die Tabelle ‚fiscal‘ direkt von der Quelle Tabellen Dinge zu beschleunigen:

with fiscal_part as (
            select fiscal
            from   SO
            where  fiscal is not null)
,    fiscal as (
            select fb.fiscal         fiscal_begin
            ,      min(fe.fiscal)    fiscal_end
            from   fiscal_part fb right join 
                   fiscal_part fe
                on fe.fiscal > fb.fiscal
            group by fb.fiscal)
,    main as (
            select *
            from   SO
            where  fiscal is null)
select main.ID
,      fiscal.fiscal_end
,      sum(main.cHour)
,      sum(main.weight)
from   main
join   fiscal on main.cdate >= coalesce(fiscal.fiscal_begin, main.cdate)
             and main.cdate <  fiscal.fiscal_end
group by main.ID
,      fiscal.fiscal_end
order by fiscal.fiscal_end

Beachten Sie auch, dass Ihre Beispieldaten einen Fehler aufweisen; das Gewicht für die letzte Periode sollte 40 (die Zeilen mit Daten 2/27 und 2/28) sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top