DB2查询表中的DISTINCT和COUNT(DISTINCT)

jk9hmnmh  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(357)

我尝试查询非重复Update_Date,但同时返回一个列,用于计算非重复Update_Date的总数
当前的表(仅查询Update_Date):

Update_Date  |  Status
-------------------------------
2022-03-01   |  1
2022-03-02   |  2
2022-03-03   |  1
2022-03-03   |  2
2022-03-03   |  3

我的SQL现在:

SELECT 
DISTINCT Update_Date, 
COUNT (DISTINCT Update_Date) AS Update_Date_CNT
FROM TABLE

预期结果应为

Update_Date  |  Update_Date_CNT
-------------------------------
2022-03-01   |  3
2022-03-02   |  3
2022-03-03   |  3

现在我收到一个错误:
DB2数据库错误:错误[42803] [IBM][DB2/AIX 64] SQL 0119 N在SELECT子句、HAVING子句或ORDER BY子句中指定的以“CLC_YYMM”开头的表达式未在GROUP BY子句中指定,或者该表达式位于带有列函数的SELECT子句、HAVING子句或ORDER BY子句中,但未指定GROUP BY子句。SQLSTATE=42803
如果我只对两列中的一列运行SELECT,则不会抛出错误。
第一个
我猜这是因为Update_Date_CNT列返回1行,而Update_Date列返回3行,并且到目前为止语法没有说明为每个Update_Date行“重复”Update_Date_CNT返回的'3'?我在另一篇关于加入的帖子中读到,但错误消息提到GROUP BY -我该如何修复此错误?

tktrz96b

tktrz96b1#

免责声明,我不使用DB2,因此可能有更好的方法,但是无论是使用CTE还是派生查询,似乎都适用于DB211.1

选项#1

WITH cte AS (
  SELECT COUNT(DISTINCT Update_Date) AS Update_Date_CNT
  FROM YourTable
)
SELECT DISTINCT t.Update_Date, cte.Update_Date_CNT
FROM   YourTable t CROSS JOIN cte

选项2

SELECT DISTINCT t.Update_Date, totals.Update_Date_CNT
FROM   YourTable t CROSS JOIN 
       (
         SELECT COUNT(DISTINCT Update_Date) AS Update_Date_CNT
         FROM YourTable
       ) totals

结果:

| 更新日期|更新日期计数|
| - -|- -|
| 2022年3月1日|三个|
| 2022年3月2日|三个|
| 2022年3月3日|三个|

kqhtkvqz

kqhtkvqz2#

这里可以使用COUNT()作为解析函数:

SELECT DISTINCT Update_Date, COUNT(*) OVER () AS Update_Date_CNT
FROM YOUR_TABLE;
doinxwow

doinxwow3#

按如下方式使用cross join

SELECT *
FROM (
    SELECT DISTINCT Update_Date
    FROM TABLE
) T1
, 
-- cross join /*new version*/
(
    SELECT COUNT (DISTINCT Update_Date) AS Update_Date_CNT
    FROM TABLE
) T2

SELECT 
  DISTINCT update_date, 
  (
    SELECT 
      Count (DISTINCT update_date) AS Update_Date_CNT 
    FROM 
      TABLE
  ) Update_Date_CNT 
FROM 
  TABLE

相关问题