获取行并在sqlserver中对它们进行计数

时间:2017-08-28 06:09:11

标签: sql sql-server stored-procedures

我写了一个存储过程,它连接三个表来从它的表中获取省标题。这是我的代码:

BEGIN
    select TbProvince.title, count(TbProvince.title) as cnt
    from TbProvince
    where TbProvince.provinceId IN (select TbCustomerUser.provinceId 
                                    from TbCustomerUser INNER JOIN
                                         TbDeals
                                         on TbCustomerUser.UserId = TbDeals.sellerUserID
                                    where TbDeals.buyerUserID = 1
                                   )
    group by TbProvince.title
end

描述:我有三张交易,客户和省份的表格。我想检索省份名称和卖家客户的数量。 上面的代码没有问题,但只返回1作为计数。客户数量不止一个 任何人都可以帮我解决我的问题吗?

3 个答案:

答案 0 :(得分:1)

您必须使用JOIN表执行customer。如果您使用半连接(在您的情况下由IN构造表示),那么您可以避免在您的情况下预期的重复。

SELECT TbProvince.title,
       COUNT(TbProvince.title) AS cnt
FROM TbProvince 
JOIN TbCustomerUser ON TbProvince.provinceId = TbCustomerUser.provinceId
JOIN TbDeals ON TbCustomerUser.UserId = TbDeals.sellerUserID
WHERE TbDeals.buyerUserID = 1
GROUP BY TbProvince.title;

答案 1 :(得分:1)

应该如此简单:

您不需要该子选择。只需加入所有三个表格,您就会收到所需的结果。

    SELECT TbProvince.title, 
           count(TbProvince.title) as cnt 
      FROM TbProvince
     INNER JOIN TbCustomerUser 
        ON TbProvince.provinceId = TbCustomerUser.provinceId
     INNER JOIN TbDeals  
        ON TbCustomerUser.UserId = TbDeals.sellerUserID
       AND TbDeals.buyerUserID   = 1
  GROUP BY TbProvince.title

为什么你的解决方案不起作用? 您的子选择将返回provinceIDs的{​​{1}}“清单”TbCustomerUserTbDeals组合,并带有您的限制TbDeals.buyerUserID = 1。 外部选择现在将返回此列表中TbProvince的所有行。 但是,对于每个达成交易的客户而言,它都没有返回。 这就是为什么你必须同时JOIN所有三个表。

答案 2 :(得分:1)

您的查询正在过滤TbProvince的行,然后汇总该表 - 并且只汇总该表。

相反,您希望将表连接在一起以计算客户而非。如果使用表别名,则查询和写入更简单:

select p.Title, count(*)
from TbCustomerUser cu join
     TbDeals d
     on cu.UserId = d.sellerUserID join
     TbProvince p
     on p.provinceId = cu.provinceId
where d.buyerUserID = 1
group by p.Title;