SQL Server中的计数和分组依据

SQL Server中的计数和分组依据,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个查询,它进行了几个连接,但我想做一个计数,按照现在的方式,每个人的计数都是1。我做错了什么,让它变得如此重要?谢谢 SELECT UserColder.ContactName, CountryUser.[User ID], COUNT(Country.Name) As num, Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = Cou

我有一个查询,它进行了几个连接,但我想做一个
计数
,按照现在的方式,每个人的计数都是1。我做错了什么,让它变得如此重要?谢谢

SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  COUNT(Country.Name) As num,
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
WHERE
  EXISTS
  (SELECT
    NULL
   FROM
    CountryUser CU2
   WHERE
    CU2.[Foreign ID] = CountryUser.[Foreign ID]
    AND CU2.[User ID] <> CountryUser.[User ID])
    GROUP BY UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID

因此,仅次于美国的应该是3个,加拿大2个,中国1个。

要计算每个国家的用户数,a是一种可能性。可能是这样的:

SELECT u.ContactName
      ,cu.[User ID]
      ,c.Name
      ,c.ID
      ,count(*) OVER (PARTITION BY c.ID) AS users_in_this_country
FROM   dbo.Country     AS  c
JOIN   dbo.CountryUser AS cu ON c.ID = cu.[Foreign ID]
JOIN   dbo.UserColder  AS  u ON cu.[User ID] = u.ID
WHERE  EXISTS (
    SELECT *
    FROM   CountryUser AS cu2
    WHERE  cu2.[Foreign ID] = cu.[Foreign ID]
    AND    cu2.[User ID] <> cu.[User ID])
    )
;With cte AS (
   < query from above >
   )
SELECT *
FROM   cte
WHERE  users_in_this_country > 1

您需要在外部查询的select部分创建一个子查询,并将其连接到外部查询。例如,它应该看起来像这样。希望这能有所帮助

SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  (SELECT COUNT(C2.Name) FROM dbo.Country C2 INNER JOIN dbo.CountryUser CU2
    ON C2.ID = CU2.[Foreign ID]
    WHERE UserColder.ID = CU2.[User ID])  As num,
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID

你能提供一些说明结果数据吗?您想根据其他列计算哪一列的数量?您想计算的具体数量是多少?如果您想计算每个名称的数量,您不应该按
Country.Name
对查询进行分组吗?我想你基本上有一组1人。太好了!谢谢你的帮助!最后一个问题如何按用户筛选此国家/地区>1?谢谢@贾斯汀:我在上面又加了一个答案。
SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  (SELECT COUNT(C2.Name) FROM dbo.Country C2 INNER JOIN dbo.CountryUser CU2
    ON C2.ID = CU2.[Foreign ID]
    WHERE UserColder.ID = CU2.[User ID])  As num,
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID