2009-06-25 3 views
0

ich die folgende Tabelle erstellt haben (über UNION ALL):Ändern Sie Datum und Gruppe von Fiscal Monatsende

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 sollte zuerst das Datum konvertieren Spalte zum nächsten Geschäftsjahresende Ende FISCAL (zum Beispiel 27.01.2007 -> 28.01.2009, 30.01.2009 -> 27.02.2009, etc.) und gruppiere dann um diesen Wert.

konnte ich 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 das nur Gruppen von Kalender Daten, nicht nach dem Fiscal Monat endet ich in der FISCAL Spalte haben.

+0

Welche DB-Engine verwenden Sie hier? Sie können auch die SQL-Nachricht bereitstellen, die die erste Ausgabe zurückgibt. –

+0

Sie müssen diese Frage klären. Fiscal in der obigen Tabelle ist 0 für die ersten 12 Einträge, also wie werden diese Daten berechnet? Sind Hour und Weight irgendwie mit der Berechnung des Geschäftsmonats verbunden? Werden mehrere Zeilen zusammengefügt, um eine einzelne Zeile zu berechnen (z. B. die Verknüpfung von AAA-Einträgen in mehreren Zeilen, um den tatsächlichen Geschäftsmonat zu bestimmen)? Reduziere auf das Grundproblem ... – razzed

+0

Der erste Schritt besteht darin, die Daten in zwei separate Tabellen zu bringen. Sie möchten, dass die zweite Tabelle die Steuermonate mit einem Startdatum und einem Enddatum für jedes Jahr darstellt. Das aus dem UNION ALL-Chaos heraus zu sortieren ist albern - viel zu sehr nach harter Arbeit. Wenn diese Tabelle verfügbar ist, wird die Gruppierung ziemlich einfach; Sie gruppieren sich am Steuerende und schließen sich an "dateval BETWEEN fiscal_start AND fiscal_end"; Das Angebot von BETWEEN/AND ist hier sehr hilfreich. –

Antwort

1

Sie sollten die Steuerdaten nicht in Ihre Tabelle aufnehmen. Aber mit der Tabelle, wie Sie sie jetzt haben, könnten Sie zuerst eine Tabelle (mit WITH, also keine besonderen Privilegien sind notwendig) mit den fiskalischen Perioden erstellen und diese Tabelle mit Ihrer Haupttabelle verbinden.

Ich nannte Ihre Tabelle SO. Ich musste auch Ihre Spalten in cHour und CDate umbenennen, weil in Oracle mindestens Date ein reserviertes Wort ist. Sie könnten sehr wohl die Tabelle ‚main‘ und die Tabelle ‚fiscal‘ direkt aus den Quelltabellen erstellen die 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 Ihre letzte Periode sollte 40 sein (die Zeilen mit Datum 2/27 und 2/28).