基于同一查询中的不同条件的多个COUNT表达式

时间:2014-05-24 11:40:59

标签: sql ms-access

我正在尝试根据Access中一个表中的数据创建一个摘要,但是我希望有人可以解决一些预期的问题。

表1看起来像这样

Region || Case ID || Tasked || Visited

对于每个地区,我想展示三个领域。

  1. 总列数(案例ID数)
  2. Total Tasked(任务=是)
  3. 总访问量(访问总数=是)。
  4. 创建总列很好,但是,一旦我开始添加WHERE子句=是,我显然会丢失总列中的数据。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我对E Mett关于性能的测试结果很感兴趣,所以我尝试重现它们。不幸的是,我不能。

我针对一个包含100万行的表运行测试,这些行驻留在网络共享上的后端.accdb文件中。我运行了三次测试(每次重新加载前端.accdb)并对结果进行平均。

SELECT 
    COUNT(*) AS TotalRows, 
    SUM(IIf(Tasked=True,1,0)) AS TaskedRows 
FROM TestData

试运行:24.8,24.0,23.8秒
平均值:24.2秒

SELECT 
    COUNT(*) AS TotalRows, 
    SUM(Abs(Tasked)) AS TaskedRows 
FROM TestData

试运行:22.3,23.8,24.9秒
平均:23.7秒

根据这些结果SUM(Abs())可能会比SUM(IIf())略快,但肯定不会快12倍。

如果速度是一个问题,你有远见在[任务]字段上放置一个索引,那么真正更快的方法就是

SELECT 
    DCount("*", "TestData") AS TotalRows, 
    DCount("*", "TestData", "Tasked=True") AS TaskedRows

试运行:2.1,3.5,2.3秒
平均值:2.6秒

与往常一样,查询性能调优本身就是一个有趣的游戏。

答案 1 :(得分:0)

使用以下内容:

SUM(ABS(Tasked)) AS TotalTasked

ABS功能会将-1转换为1

AbsIIf快约12倍!如果您有数千条记录,则可能会有所不同。