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
我正在尝试查询 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