0

我有一个表flags,我试图从中提取两个COUNTs。

我想要一个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试图加入同一个表两次的子句。

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

4

1 回答 1

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`
于 2013-07-09T13:06:58.557 回答