مجنون SQL سؤال: كيفية القيام بنوع من التقاطع تطبيق مع محور؟

StackOverflow https://stackoverflow.com/questions/1691326

  •  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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top