总和和记录数

Sum and count of records

我有一个 table 有一些记录:

第 1 栏 第 2 列 第 3 列 第 4 栏
1 第 1 行 99 152
1 第 2 行 99 20
5 第 3 行 98 34
1 第 4 行 120 18
7 第 5 行 27 74

我需要得到 Col4 值的总和,其中 Col1 = 1Col4 值的总和,其中 Col3 = 99Col1 = 1,[= 的总和11=] 值 Col3 <> 99Col1 = 1,记录总数 Col1 = 1,记录数 Col3 = 99Col1 = 1,记录数 Col3 <> 99Col1 = 1(有可能没有符合条件的记录)。

我的 SQLite 语句如下所示:

    query.SQL.Text:= 'SELECT IFNULL(sum(Col4), 0), '+
                     'IFNULL(sum(case when Col3 = 99 then Col4 else 0 end), 0), ' +
                     'IFNULL(sum(case when Col3 <> 99 then Col4 else 0 end), 0), ' +
                     'IFNULL(count(*), 0), ' +
                     'IFNULL(sum(case Col3 = 99 then 1 else 0 end), 0), ' +
                     'IFNULL(sum(case Col3 <> 99 then 1 else 0 end), 0) ' +
                     'FROM myTable WHERE Col1 = :_Col1';

有没有办法简化它?

SQLite 将布尔表达式计算为 1 (true) 或 0 (false),因此 CASE 表达式如:

case when Col3 = 99 then 1 else 0 end

可以简化为:

Col3 = 99

此外,CASE 表达式中的 ELSE 部分如:

CASE WHEN Col3 = 99 THEN Col4 ELSE 0 END 

不需要,因为稍后您使用 IFNULL() 到 return 0 以防它 returns NULL.

最后,COUNT(*) 永远不会 returns NULL,所以在这种情况下不需要 IFNULL()

将您的代码简化为:

SELECT IFNULL(SUM(Col4), 0),
       IFNULL(SUM(CASE WHEN Col3 = 99 THEN Col4 END), 0),
       IFNULL(SUM(CASE WHEN Col3 <> 99 THEN Col4 END), 0),
       COUNT(*),
       IFNULL(SUM(Col3 = 99), 0),
       IFNULL(SUM(Col3 <> 99), 0)
FROM myTable 
WHERE Col1 = 1;

参见demo