Sql 是否可以在不使用聚合函数的情况下编写此查询?
我希望结果是Locations中所有条目的LocID,第二列是拥有此位置权限的用户数,该位置中至少有一个设备的权限由UserModelRights中的条目确定 我只能想办法得到我想要的东西,就像这样:Sql 是否可以在不使用聚合函数的情况下编写此查询?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我希望结果是Locations中所有条目的LocID,第二列是拥有此位置权限的用户数,该位置中至少有一个设备的权限由UserModelRights中的条目确定 我只能想办法得到我想要的东西,就像这样: SELECT l.LocID, COUNT(ulr.UserID) FROM Locations l LEFT OUTER JOIN UserLocationRights ulr ON l.LocID = ulr.LocID LEFT OUTER JOIN Devices d ON l.LocID
SELECT l.LocID, COUNT(ulr.UserID)
FROM Locations l
LEFT OUTER JOIN UserLocationRights ulr ON l.LocID = ulr.LocID
LEFT OUTER JOIN Devices d ON l.LocID = d.LocID
LEFT OUTER JOIN UserModelRights umr ON d.ModelName = umr.ModelName
AND ulr.UserID = umr.UserID
GROUP BY l.LocID, ulr.UserID, d.ModelName
ORDER BY l.LocID, ulr.UserID
我不知道这是否可行,但我假设有一种方法可以使用GROUP BY通过我的第一个小得多的查询获得我想要的。问题是,我认为我需要按照特定的顺序执行多个分组,我不知道这是否可行,或者在SQL中是否有意义
有没有一种方法可以在不使用聚合函数的情况下得到我想要的结果?如果没有,也许可以把范围缩小到一个范围?如果没有样本数据,我觉得这有点难以理解。但根据您的描述,这可能会满足您的要求:
SELECT l.LocID, IsNull(UserHasModelRightInLoc.UserCount, 0) UserCount
FROM Locations l
LEFT OUTER JOIN (
SELECT ulr.LocID, COUNT(UserModelRightsPerLocation.UserID) UserCount
FROM UserLocRights ulr
INNER JOIN (
SELECT l.LocID, umr.UserID
FROM UserModelRights umr
INNER JOIN Devices d ON umr.ModelName = d.ModelName
INNER JOIN Locations l ON d.LocID = l.LocID
GROUP BY umr.ModelName, umr.UserID, l.LocID
) UserModelRightsPerLocation ON ulr.LocID = UserModelRightsPerLocation.LocID
AND ulr.UserID = UserModelRightsPerLocation.UserID
GROUP BY ulr.LocID
) UserHasModelRightInLoc ON l.LocID = UserHasModelRightInLoc.LocID
ORDER BY l.LocID
你能展示样本数据和期望的结果吗?只需对查询进行反向工程以编写不同的版本,将其扔到墙上,然后猜测它是否仍然得到正确的结果,这将是一件乏味的事情。不,如果不使用聚合函数,就无法进行计数,为什么要这样做呢?如果没有聚合函数,您如何期望聚合?如果不使用聚合函数,则无法计数:这是不正确的@TabAlleman。也许聚合是最好的解决方案,但您可以使用许多其他选项进行计算。例如,使用具有TOP 1的行数或秩函数。同样,我并不是说这是正确的解决方案,而是说只有计数才能在没有聚合的情况下进行。@Eric,我没有对这个问题进行评论,而是对必须使用聚合函数进行计数的错误假设进行了评论。一旦OP将提供DDL+DML,我将解决这个问题……不加聚合的计数:DECLARE@T TABLE x int;插入@Tx值2,5,7,6;将MyCTE设置为SELECT RN=ROW_NUMBER OVER ORDER BY x DESC FROM@T SELECT TOP 1 RN FROM MyCTE ORDER BY RN DESC这听起来非常接近我想要做的事情,如果不完全一样的话。唯一的问题是,我得到的计数与我的OP中的查询不同,聚合函数正在返回,我不确定为什么…我通过将其更改为以下方式获得了匹配的结果:选择l.LocID,COUNTDISTINCT ulr.UserID FROM LocStruct l LEFT JOIN Devices d ON l.LocID=d.LocID LEFT JOIN UserModelRights umr ON d.ModelName=umr.ModelName LEFT JOIN UserLocRights ulr ON l.LocID=ulr.LocID和ulr.UserID=umr.UserID按l.LocID顺序按l.LocID分组;
SELECT l.LocID, COUNT(DISTINCT ulr.UserID)
FROM Locations l LEFT JOIN
UserLocationRights ulr
ON l.LocID = ulr.LocID LEFT JOIN
Devices d
ON l.LocID = d.LocID LEFT JOIN
UserModelRights umr
ON d.ModelName = umr.ModelName AND
ulr.UserID = umr.UserID
GROUP BY l.LocID
ORDER BY l.LocID;