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