Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以在不使用聚合函数的情况下编写此查询?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 是否可以在不使用聚合函数的情况下编写此查询?

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

我希望结果是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 = 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;