2013-07-09 2 views
0

У меня есть таблица с именем flags, из которой я пытаюсь извлечь два COUNT s.Пытаясь использовать COUNT ту же таблицу для разных значений

Я хочу один COUNT для количества флагов с начала года и отдельно COUNT для распределения на этой неделе.

Запрос Я использую выглядит следующим образом:

SELECT 
    COUNT(f1.ID) AS `Total Flags`, 
    COUNT(f2.ID) AS `Weekly Flags` 
FROM `frog_flags`.`flags` f1 
LEFT JOIN `frog_flags`.`flags` f2 
    ON f1.`ID` = f2.`ID` 
WHERE 
    f2.`Datetime` > '2013-07-08 00:00:00' 
AND 
    (f1.`Staff_ID` = '12345' AND f2.`Staff_ID` = '12345') 
AND 
    f1.`Datetime` > '2012-09-01 00:00:00' 

Даже если у меня есть данные на месте, он показывает 0 для обоих Total Flags и Weekly Flags.

Я подозреваю, что я смутил свои статьи WHERE за попытку присоединиться к одной и той же таблице дважды.

Я неправильно использую свои предложения при попытке указать ту же таблицу для разных значений?

ответ

1

Это SQL-запрос вкладок кросса - это отличный шаблон дизайна, как только вы получите повесить его:

SELECT 
    sum(case when `Datetime`> '2012-09-01 00:00:00' then 1 else 0 end) AS `Total Flags`, 
    sum(case when `Datetime`> '2013-07-08 00:00:00' then 1 else 0 end) AS `Weekly Flags` 
FROM `frog_flags`.`flags` f1 
WHERE f1.`Staff_ID` = '12345' 

используется условием для создания в основном логических флагов, которые получают суммированные вверх - это позволяет ряд предопределенных новых столбцов вместо строк.

Вы могли бы принять его дальше и сделать это для всех сотрудников одновременно:

SELECT 
f1.`Staff_ID`, 

    sum(case when `Datetime`> '2012-09-01 00:00:00' then 1 else 0 end) AS `Total Flags`, 
    sum(case when `Datetime`> '2013-07-08 00:00:00' then 1 else 0 end) AS `Weekly Flags` 
FROM `frog_flags`.`flags` f1 
WHERE f1.`Staff_ID` = '12345' 
GROUP BY f1.`Staff_ID` 
+0

красивый способ сделать это, на самом деле. Приветствия :) – dunc

Смежные вопросы