我在SQL查询中计算两件事时遇到了麻烦。我需要从营销和销售人员中提取至少五次访问过的文件列表。我知道我错误地使用了COUNT
,但我不知道怎么做。这是我到目前为止的查询:
SELECT FileId
FROM Files
JOIN FileAccesses ON Files.FileId = FileAccesses.FileId
WHERE Count(AccessUserGroup=1)>5 AND Count(AccessUserGroup=2)>5
它产生错误
')附近的语法错误。
。
Files
是一个以int
FileId
为主键的表格。 FileAccesses
存储来自FileId
的{{1}}值,但不存储主键。每次用户触摸文件时,它都会跟踪一堆元数据。出于此问题的目的,重要的部分是Files
,AccessUserGroup
设置为tinyint
用于营销,1
用于销售。
答案 0 :(得分:1)
这是您想要的查询:
JOIN
注意:
FileAccesses
,除非Files
的文件ID不在GROUP BY
中(我认为不太可能)。HAVING
。COUNT()
条款。SUM()
在SQL Server中产生错误(它在其他一些数据库中有效)。带有CASE
的{{1}}执行条件聚合。答案 1 :(得分:0)
我猜您还需要实际的文件信息,而不仅仅是文件ID,因此您可以使用cte(公用表表达式)https://msdn.microsoft.com/en-us/library/ms175972.aspx
;WITH cte AS (
SELECT FileAccesses.FileId FROM FileAccesses
GROUP BY FileId
HAVING COUNT(CASE AccessUserGroup WHEN 1 THEN 1 ELSE NULL END) > 5
AND COUNT(CASE AccessUserGroup WHEN 2 THEN 1 ELSE NULL END) > 5
)
SELECT * FROM File
INNER JOIN cte ON File.FileId = cte.FileId