2011-03-09 54 views
1

我想知道有多少行如何去这个查询返回:如何使用db2中的group by子句做COUNT(*)?

SELECT 
    MONTH(DHSTMP), SUM(DHDLDY), SUM(DHBUDS), YEAR(DHSTMP) 
FROM 
    DSHDAY 
WHERE 
    DHSTMP BETWEEN '2009-07-26 00:00:00' AND '2011-03-09 23:59:59' 
GROUP BY 
    YEAR(DHSTMP), MONTH(DHSTMP) ORDER BY YEAR(DHSTMP), MONTH(DHSTMP) 

所以,我想:

SELECT 
    COUNT(*) 
FROM 
    DSHDAY 
WHERE 
    DHSTMP BETWEEN '2009-07-26 00:00:00' AND '2011-03-09 23:59:59' 
GROUP BY 
    YEAR(DHSTMP), MONTH(DHSTMP) 

但它告诉我多少行每个组。

如何获取第一个查询将返回的行数?

回答

6

这应该工作。但它不是高性能的。
(如果你只在计数兴趣,你可能不希望计算和汇总和排序)

SELECT COUNT(*) 
FROM (
    SELECT 
    MONTH(DHSTMP), 
    SUM(DHDLDY), 
    SUM(DHBUDS), 
    YEAR(DHSTMP) 
    FROM DSHDAY 
    WHERE DHSTMP BETWEEN '2009-07-26 00:00:00' AND '2011-03-09 23:59:59' 
    GROUP BY 
    YEAR(DHSTMP), 
    MONTH(DHSTMP) 
    ORDER BY 
    YEAR(DHSTMP), 
    MONTH(DHSTMP) 
) i 


试试这个

SELECT COUNT(DISTINCT i.month_year) 
FROM (
    SELECT 
    CONCAT(MONTH(DHSTMP), YEAR(DHSTMP)) AS month_year 
    FROM DSHDAY 
    WHERE DHSTMP BETWEEN '2009-07-26 00:00:00' AND '2011-03-09 23:59:59' 
) i 


变化(在回答迈克的评论)

SELECT COUNT(*) 
FROM (
    SELECT 0 
    FROM DSHDAY 
    WHERE DHSTMP BETWEEN '2009-07-26 00:00:00' AND '2011-03-09 23:59:59' 
    GROUP BY 
    YEAR(DHSTMP), 
    MONTH(DHSTMP) 
) i 
+0

我注意到,这也适用,它是否更好的性能? SELECT COUNT(*)FROM(SELECT 0 FROM DSHDAY WHERE DHSTMP BETWEEN'2009-07-26 00:00:00'AND'2011-03-09 23:59:59')i – Mike 2011-03-09 16:13:19

+0

您的变体会将这些条目数加倍同月/年。这就是为什么我在列连接上做了一个明确的计数。如果添加了GROUP BY,则评论中的SQL可能没有问题。看到我编辑的答案。 – 2011-03-09 16:32:49