تغيير التاريخ ومجموعة من المالية شهر النهاية
سؤال
ولقد خلق الجدول التالي (عبر 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
وأود أن استرداد:
ID Date Hour Weight
AAA 1/28/2009 10 10
AAA 2/27/2009 50 50
AAA 3/29/2009 20 20
ويجب أن أولا تحويل عمود التاريخ إلى نهاية الشهر المالية المقبلة المالية العامة (على سبيل المثال 2007/1/27 -> 2009/01/28، 2009/01/30 -> 2009/02/27، الخ) و ثم مجموعة من تلك القيمة.
وكنت قادرا على استخدام:
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
ولكن هذا مجرد مجموعة ل التقويم التواريخ، وليس وفقا لشهر المالي ينتهي لدي في <ط> المالية العامة العمود.
المحلول
وأنت لا ينبغي أن نقابة مواعيد المالية في الجدول الخاص بك. ولكن مع الجدول لديك الآن، هل يمكن أولا إنشاء جدول (باستخدام مع، لذلك لا priviliges الخاصة ضرورية) مع 'فترات "المالية وانضمام هذا الجدول مع الجدول الرئيسي الخاص بك.
ودعوت الجدول الخاص بك SO. كما أتيحت لي لإعادة تسمية الأعمدة إلى شور وCDate لأنه في أوراكل على الأقل التاريخ هو كلمة محجوزة. هل يمكن المحتمل جدا إنشاء الجدول 'الرئيسي' والجدول 'المالية' مباشرة من جداول المصدر لتسريع الامور:
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
لاحظ أيضا أن بيانات العينة لديه خطأ. يجب أن يكون وزنه لآخر دورة شهرية لك 40 (الصفوف بتواريخ 27/2 و 28/2).