总和和记录数
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 = 1
,Col4
值的总和,其中 Col3 = 99
和 Col1 = 1
,[= 的总和11=] 值 Col3 <> 99
和 Col1 = 1
,记录总数 Col1 = 1
,记录数 Col3 = 99
和 Col1 = 1
,记录数 Col3 <> 99
和Col1 = 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。
我有一个 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 = 1
,Col4
值的总和,其中 Col3 = 99
和 Col1 = 1
,[= 的总和11=] 值 Col3 <> 99
和 Col1 = 1
,记录总数 Col1 = 1
,记录数 Col3 = 99
和 Col1 = 1
,记录数 Col3 <> 99
和Col1 = 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。