كيفية الحصول على البيانات مرة أخرى من ماي لأيام التي ليس لها إحصاءات

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

وعلى سبيل المثال: بيانات:

ID_Profile    datCreate
1   2009-02-25 16:45:58
2   2009-02-25 16:45:58
3   2009-02-25 16:45:58
4   2009-02-26 10:23:39
5   2009-02-27 15:07:56
6   2009-03-05 11:57:30

وSQL:

    SELECT 
        DAY(datCreate) as RegistrationDate, 
    COUNT(ID_Profile) as NumberOfRegistrations 
    FROM tbl_profile
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY)
    GROUP BY RegistrationDate
    ORDER BY datCreate ASC;

في هذه الحالة ستكون النتيجة:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
5   1

من الواضح أنا في عداد المفقودين بضعة أيام بين بين. حاليا أنا حل هذا في قانون بلدي بي، ولكني أتساءل عما اذا كان الخلية لديه أي طريقة للعودة تلقائيا 0 عن المفقودين أيام / الصفوف. وستكون هذه النتيجة المرجوة:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
28      0
1       0
2       0
3       0
4       0
5   1

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

وشكرا مقدما

هل كانت مفيدة؟

المحلول

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

والآن، يمكن أن تترك JOIN البيانات الإحصائية الخاصة بك ضدها - ثم ستحصل على القيم الخالية لتلك الأيام مع أية بيانات. إذا كنت تريد حقا صفر بدلا من لاغية، استخدم <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull" يختلط = "نوفولو noreferrer" > IFNULL (colname، 0)

نصائح أخرى

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

أولا إنشاء إجراء مخزن وجدت في مكان ما لملء الجدول مع جميع التواريخ من هذا العام.

CREATE Table calendar(dt date not null);

CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT)
  BEGIN
    SET @begin = 'INSERT INTO calendar(dt) VALUES ';
    SET @date = start_date;
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY);
    SET @temp = '';
    REPEAT
      SET @temp = concat(@temp, '(''', @date, '''), ');
      SET @date = ADDDATE(@date, INTERVAL 1 DAY);
      UNTIL @date > @max
    END REPEAT;
    SET @temp = concat(@temp, '(''', @date, ''')');
    SET result_text = concat(@begin, @temp);
  END


   call sp_calendar('2009-01-01', '2010-01-01', @z);

   select @z;

وبعد ذلك تغيير الاستعلام لإضافة اليسار الانضمام:

SELECT
    DAY(dt) as RegistrationDate,
    COUNT(ID_Profile) as NumberOfRegistrations
FROM calendar
LEFT JOIN 
    tbl_profile ON calendar.dt = tbl_profile.datCreate
WHERE dt  BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY)  AND CURDATE()
GROUP BY RegistrationDate
ORDER BY dt ASC

ونحن القيام به.

والشكر للجميع الردود سريعة والحل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top