Search code examples
sqlsql-servercountgreatest-n-per-group

COUNT results from SQL Query with a HAVING clause


Are you able to use COUNT in a query with a HAVING clause so that the COUNT returns the number of rows? When I try, Im getting the count of the number of times the ID shows up in the table. Here is the query:

SELECT col_appid, min(col_payment_issued_date) as PayDate  
FROM tbl_ui_paymentstubs  
WHERE isnull(col_payment_amount,0) > 0  
GROUP BY col_appid  
HAVING min(col_payment_issued_date) >= '09/01/2010' and min(col_payment_issued_date) <= '09/30/2010'

I get back 6 rows, which is fine, but i'd like to just get back the number 6.

I found I could do it this way, but was wondering if there was another, more elegant way:

WITH Claims_CTE(AppID, PayDate) as
(  
 SELECT col_appid, min(col_payment_issued_date) as PayDate
 FROM tbl_ui_paymentstubs
 WHERE isnull(col_payment_amount,0) > 0
 GROUP BY col_appid
 HAVING min(col_payment_issued_date) >= '09/01/2010' and min(col_payment_issued_date) <= '09/30/2010'
)  
 SELECT count(AppID) as Amount from Claims_CTE

`


Solution

  • Using COUNT with a GROUP BY clause will provide a count for each group. If you want the count of the number of groups, it will have to be a separate query (like your CTE example).

    I would just use a simple subquery, instead of the CTE:

    SELECT COUNT(*) FROM 
     (SELECT col_appid, min(col_payment_issued_date) as PayDate  
      FROM tbl_ui_paymentstubs  
      WHERE isnull(col_payment_amount,0) > 0  
      GROUP BY col_appid  
      HAVING
         min(col_payment_issued_date) >= '09/01/2010'
         and min(col_payment_issued_date) <= '09/30/2010') Claims