如何使用group by和having进行计数

时间:2016-08-24 17:30:39

标签: sql tsql

我的查询返回31行“private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello {0}", textBox1.Text); } ”。即便如此,我正在做1

我取出COUNT(),它返回了31行status_number。所以它返回了我期望的正确数量的结果,但是如何强制它返回31而不是31行“COUNT()”。

1

目前正在返回:

SELECT
COUNT(DISTINCT d.status_number)
FROM dealers d
INNER JOIN contracts c ON d.status_number= c.status_number
WHERE d.iagent_id = 79 AND d.status_code IN ('A', 'R')
AND d.status_number NOT LIKE '%demo%'
AND c.sale_date > DATEADD(MONTH, -4, GETDATE())
GROUP BY d.status_number
HAVING COUNT(DISTINCT c.sale_date ) >= 5 

需要它返回:

(No column name)
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

(No column name) 31 是用户列表,status_number是系统中唯一的标识号。 status_code是它们是活动/非活动等等。

Table d是合同销售清单。我试图仅返回过去4个月内已售出5个或更多合同的用户数。

返回31的查询是正确的结果。

3 个答案:

答案 0 :(得分:1)

我猜你想要这样的东西:

SELECT COUNT(*)
FROM (SELECT d.status_number
      FROM dealers d INNER JOIN
           contracts c
           ON d.status_number = c.status_number
      WHERE d.iagent_id = 79 AND d.status_code IN ('A', 'R') AND
            d.status_number NOT LIKE '%demo%' AND
            c.sale_date > DATEADD(MONTH, -4, GETDATE())
      GROUP BY d.status_number
      HAVING COUNT(DISTINCT c.sale_date ) >= 5 
     ) cd;

也就是说,您需要两个聚合,因此您需要使用子查询,CTE或一些相关构造进行两次聚合。您的查询在外部查询中不需要COUNT(DISTINCT),因为status_number已使GROUP BY已经不同。

答案 1 :(得分:1)

试试这个:

SELECT COUNT(DISTINCT d.status_number)
FROM dealers od
where exists 
   (Select * from dealers d
       JOIN contracts c 
          ON c.status_number= d.status_number
    WHERE d.status_number = od.status_number 
       and d.iagent_id = 79 
       AND d.status_code IN ('A', 'R')
       AND d.status_number NOT LIKE '%demo%'
       AND c.sale_date > DATEADD(MONTH, -4, GETDATE())
    group by status_number 
    HAVING COUNT(DISTINCT c.sale_date ) >= 5)

答案 2 :(得分:0)

根据状态编号分组后,您可以计算出您拥有的状态编号的数量,当然,您将获得大量的1。

如果您想要计算不同的状态编号,请从查询中删除group by子句。

如果您想要计算每个不同状态号的行数,请删除计数中的distinct子句。