مجنون SQL سؤال: كيفية القيام بنوع من التقاطع تطبيق مع محور؟
-
18-09-2019 - |
سؤال
لدى العميل اختصارات في بياناتهم حيث لديهم كمية السجلات في حقل. عندما أقوم بتحليلها، أحتاج إلى تصنيع السجلات، واحدة لكل كمية، زيادة "المعرف" بنسبة 7 أيام (لأن الرقم يمثل تاريخا.
مثال: منتج واحد للبيع لمدة أربعة أسابيع وأحتاج إلى أربعة سجلات، منتج واحد لكل أسبوع.
رقم الحدث
تصنيف
تشغيل الأسابيع
بعض البيانات
2009 11 29 00
1
1
يدير أسبوع واحد
2009 12 06 00
2
1
يدير أسبوع واحد
2009 12 13 00
1
4
يدير أربعة أسابيع
2009 12 20 00
2
4
يدير أربعة أسابيع
بطريقة ما أحتاج إلى تحويل هذه البيانات إلى ما يلي برؤية (SQL SELECT) (الكل في نفس الجدول، شملت المساحة البيضاء لرؤية الأجزاء:
رقم الحدث + التصنيف
بعض البيانات
2009 11 29 01
يعمل لمدة أسبوع واحد أسبوع واحد هكذا سجل واحد.
2009 12 06 02
يعمل لمدة أسبوع واحد
2009 12 13 01
يعمل لمدة أربعة أسابيع يكرر 4 مرات زيادة تاريخ 7
2009 12 20 01
يعمل لمدة أربعة أسابيع
2009 12 27 01
يعمل لمدة أربعة أسابيع
2009 01 03 01
يعمل لمدة أربعة أسابيع
2009 12 20 02
يعمل لمدة أربعة أسابيع يكرر 4 مرات زيادة تاريخ 7
2009 12 27 02
يعمل لمدة أربعة أسابيع
2009 01 03 02
يعمل لمدة أربعة أسابيع
2009 01 10 02
يعمل لمدة أربعة أسابيع
أفكاري هي أن يكون هناك نوع من Pivot Cross تطبيق رمز SQL؟
المحلول
لدي إجابة رخيصة بالنسبة لك. يمكنك استخدام "المقدمة مسبقا" Weeks
جدول لإنشاء حلقة استنادا عن الاستعلام. ستحتاج إلى وضع أسابيع كافية لتغطية مجموعة السيناريوهات المتوقعة الخاصة بك.
[Week]
1
2
3
4
ثم انضم إلي الاستعلام الخاص بك [Weeks Running]
لهذا الجدول، باستخدام عدم المساواة OriginalTable.WeeksRunning <= Weeks.Week
. وبعد في نهاية المطاف مع صف واحد في الأسبوع.
يمكنك استنتاج التاريخ عن طريق إضافة Weeks.Week * 7
أيام إلى تاريخ مضمن في رقم الحدث الخاص بك.
نصائح أخرى
هذا شيء من شأنه أن يكون أكثر بساطة من المحتمل أن يفعله على جانب التطبيق بدلا من جانب قاعدة البيانات، لكنني سأعطيه طلقة ... هذا يتطلب قاعدة بيانات تدعم CTES، والتي لا حدوثها في متناول اليد، لذلك هذا غير مهتم.
WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
SELECT eventNumber, classification, 1, weeksRunning, someData
FROM originalTable
WHERE weeksRunning > 0
UNION ALL
SELECT eventNumber + 7, classification, index + 1, count, someData
FROM expandedTable
WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;