尝试为不同的值计算同一个表

时间:2013-07-09 12:59:30

标签: mysql

我有一个名为flags的表,我正试图从中提取两个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'

即使我有数据,它也会0Total Flags显示Weekly Flags

我怀疑我混淆了我的WHERE条款试图加入同一张桌子两次。

在尝试为不同的值计算同一个表时,我是否错误地使用了我的子句?

1 个答案:

答案 0 :(得分: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`