如何从具有子句的 DB2 中获取 count(*) 总数?
Posted
技术标签:
【中文标题】如何从具有子句的 DB2 中获取 count(*) 总数?【英文标题】:How to get count(*) total from DB2 with having clause? 【发布时间】:2017-12-03 07:27:48 【问题描述】:如何在 DB2 中使用 group by 子句获取所有返回行的总和?
例如:
Desc Ctr ---- --- 碗 30 板 21 勺子 6 总和 57
SELECT COUNT (name) as Desc, Count(*) OVER ALL 按名称分组
上述查询从 DB2 返回错误。返回所有行的 SUM 的正确 SQL 语句是什么?
谢谢, 布兰登。
【问题讨论】:
您的表格看起来如何,您的预期输出是什么?无法从您的示例中理解。 【参考方案1】:试试这个查询, select name, count(*) from table group by name
【讨论】:
Count(*) 将在每行中提供与 count(name) 相同的计数...我想查看总行数,即 57。【参考方案2】:您的 Db2 平台是什么?
如果你只想要总行数,那么
select count(*)
from mytable
如果您想要按名称加上总数的小计,SQL 最初并不支持。您必须合并这两个结果。
select name, count(*) as cnt
from mytable
group by name
UNION ALL
select '', count(*)
from mytable
不过,更现代的版本添加了ROLLUP
(和CUBE
)功能...
select name, count(*) as cnt
from mytable
group by name with rollup
编辑
要为 name 设置值,您可以简单地使用 COALESCE()
假设 name 除了在总行中之外永远不会为空。
select coalesce(name,'-Total-') as name, count(*) as cnt
from mytable
group by name with rollup
更正确的方法是使用GROUPING()
函数
要么只返回标志
select name, count(*) as cnt, grouping(name) as IS_TOTAL
from mytable
group by name with rollup
或者用它来设置文字
select case grouping(name)
when 1 then '-Total-'
else name
end as name
, count(*) as cnt
from mytable
group by name with rollup
包括总数
要包括每一行的总数,你可以这样做......
with tot as (select count(*) as cnt from mytable)
select name
, count(*) as name_cnt
, tot.cnt as total_cnt
from mytable
cross join tot
group by name
请注意,这将读取 mytable 两次,一次用于总计,另一次用于详细行。但很明显你在做什么。
另一种选择是这样的
with allrows as (
select name, count(*) as cnt, grouping(name) as IS_TOTAL
from mytable
group by name with rollup
)
select dtl.name, dtl.cnt, tot.cnt
from allrows dtl
join allrows tot
on tot.is_total = 1
where
dtl.is_total = 0
【讨论】:
您好查尔斯,感谢您的推荐。 DB2 在 AS400 平台上,支持汇总功能。 Rollup 有效,我快到了。结果如下。有没有办法将最后一行的 NULL 更改为有意义的名称,以便我的应用程序可以引用它?代码计数汇总 30 6 6 50 61 61 81 19 19 NULL 86 86 您好 Charles,要求已更改。现在,我需要包括每一行的总数。 column1 将具有单个状态的计数。 Column2 将包含所有状态的总数。例如: SELECT COUNT(A.state), Count(*) as 'total' FROM TABLE A WHERE A.date = '12/5/2017' GROUP BY A.state 如何在 column2 中包含每一行的总数?抱歉,我正在学习 DB2 SQL 编程。希望你能对此有所了解!再次感谢。 @Brandon168 查看包含总计部分以上是关于如何从具有子句的 DB2 中获取 count(*) 总数?的主要内容,如果未能解决你的问题,请参考以下文章
DB2-具有DISTINCT子句的LISTAGG()-不起作用?
我们应该在检索数据时避免 DB2 SQL 中的 IN 子句吗?
使用 cursor.getCount() 获取计数或在 SQL 子句上使用 COUNT 执行 rawQuery?
在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?