2013-07-09 53 views
0

我有一个表flags我试图提取两个COUNT s。试图计算相同的表为不同的值

我想要一个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' 

即使我已经到位的数据,它显示0Total FlagsWeekly 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