DB2 为 DISTINCT 和 COUNT(DISTINCT) 查询 table

DB2 Querying a table for both DISTINCT and COUNT(DISTINCT)

我正在尝试查询 distinct Update_Date 以及 return 计算 distinct Update_Date

总数的列

现在的table(只有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 Database Error: ERROR [42803] [IBM][DB2/AIX64] SQL0119N An expression starting with "CLC_YYMM" specified in a SELECT clause, HAVING clause, or ORDER BY clause is not specified in the GROUP BY clause or it is in a SELECT clause, HAVING clause, or ORDER BY clause with a column function and no GROUP BY clause is specified. SQLSTATE=42803

如果我 运行 SELECT 只有两列之一,则不会抛出任何错误。

SELECT 
DISTINCT Update_Date
FROM TABLE
Update_Date  
-----------
2022-03-01   
2022-03-02   
2022-03-03   
SELECT 
COUNT (DISTINCT Update_Date) AS Update_Date_CNT
FROM TABLE
Update_Date_CNT 
---------------
3  

我猜这是因为 Update_Date_CNT 列 returns 1 行而 Update_Date 列 returns 3 行,到目前为止的语法没有不是说要为每个 Update_Date 行“重复”由 Update_Date_CNT 编辑的“3”return吗? 我在另一个 post 中读到有关加入的信息,但错误消息提到 GROUP BY - 我该如何解决这个错误?

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

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

免责声明,我不使用 DB2,因此可能有更好的方法,但使用 CTE 或派生查询似乎适用于 DB2 11.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

结果:

UPDATE_DATE UPDATE_DATE_CNT
2022-03-01 3
2022-03-02 3
2022-03-03 3

使用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