Ändern Sie Datum und Gruppe von Fiscal Monatsende
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.
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.