2011-03-09 55 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