مجموعة SQL بواسطة التاريخ، ولكن الحصول على مواعيد ث / س السجلات أيضا

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة للقيام GROUP BY DATE(timestamp) أن يشمل جميع أيام في فترة من الزمن، بغض النظر عما إذا كان هناك أي سجلات المرتبطة بهذا التاريخ؟

وفي الأساس، ولست بحاجة لإنشاء تقرير مثل هذا:

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
هل كانت مفيدة؟

المحلول

وبدلا من استخدام GROUP BY، وجعل الجدول (ربما جدول مؤقت) الذي يحتوي على تواريخ محددة تريد، على سبيل المثال:

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

وبعد ذلك، والانضمام هذا الجدول إلى جدول Orders.

نصائح أخرى

وبفرض أن لديك المزيد من الطلبات من التمور شيئا من هذا القبيل يمكن أن تعمل:

select date, count(id) as orders
from
(
  SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date

وأسلوب واحد هو لإنشاء جدول الزمني والانضمام ضدها.

وأنا من شأنه أن يخلق بشكل دائم، ثم قم بإنشاء المهمة التي سيتم إدراج مواعيد جديدة، ويمكن أن يتم ذلك أسبوعيا، يومي وشهري وغيرها.

ملحوظة، التي أنا على افتراض أن تقوم بتحويله الطابع الزمني الخاص بك إلى تاريخ.

وتحتاج إلى توليد نتيجة المتوسطة مع مجموعة كل التواريخ في أن تريد تضمينها في الإخراج ...

وإذا كنت تفعل هذا في بروك المخزنة، ثم هل يمكن إنشاء جدول مؤقت أو متغير الجدول (أنا لا knoiw قدرات الخلية)، ولكن مرة واحدة لديك كل التواريخ في جدول أو resultset ومن نوع

ومجرد الانضمام إلى dataa الحقيقي من الجدول المؤقت، وذلك باستخدام صلة خارجية

في SQL خادم سيكون مثل هذا

  Declare @Dates Table (aDate DateTime Not Null)
  Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
  Declare @EndDt   DateTime Set @EndDt   = 'Dec 31 2008'
  While @StartDt < @EndDt Begin
    Insert @Dates(aDate) Values(@StartDt)
    Set @StartDt = DateAdd(Day, 1, @StartDt)
  End

   Select D.aDate, Count(O.*) Orders
   From @Dates D Left Join 
      OrderTable O On O.OrderDate = D.aDate
   Group By D.aDate

في مستودع البيانات، وطريقة اتخاذها هو إنشاء جدول الذي يحتوي على كافة التواريخ وإنشاء مفتاح خارجي بين البيانات والجدول التاريخ. أنا لا أقول أن هذا هو أفضل وسيلة للذهاب في قضيتك، مجرد أن هذا هو أفضل الممارسات في الحالات التي تحتاج إلى أن طوى في العديد من الطرق لأغراض الإبلاغ كميات كبيرة من البيانات.

إذا كنت تستخدم طبقة التقارير على SQL Server و هل يمكن أن مجرد كتابة بعض المنطق لادخال مواعيد المفقودين في نطاق الفائدة بعد عودة البيانات وذلك قبل إصدار التقرير الخاص بك.

إذا كنت تقوم بإنشاء التقارير الخاصة بك مباشرة من SQL Server و لم يكن لديك بالفعل مستودع البيانات وليس هناك وقت أو حاجة لإنشاء واحد في الوقت الراهن، وأود أن إنشاء جدول تاريخ والانضمام إليها. التنسيق الضروري للقيام الانضمام والحصول على الإخراج الذي تريد قد يكون متزعزع قليلا، لكنه لن يحصل على هذه المهمة.

وهناك طريقة جميلة واضحة للقيام بذلك ... إلا أنني لا أستطيع تذكرها. لكنني تكييفها هذا الاستعلام من هذا الموضوع :

SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`

وكان يعمل في الخلية جدا

scroll top