如何从具有子句的 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 子句吗?

DB2 获取具有可变列名的列

使用 cursor.getCount() 获取计数或在 SQL 子句上使用 COUNT 执行 rawQuery?

如何从 Db2 中的十进制字段中获取无效值列表?

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?