gpt4 book ai didi

sql - 在 SQL 中正确使用 Count() 和 Sum() 吗?

转载 作者:行者123 更新时间:2023-12-03 03:29:12 27 4
gpt4 key购买 nike

好吧,所以我希望我能很好地解释这个问题,因为我觉得这将是一个很难的问题。

我今天正在使用两张表。这些看起来像:

@pset table (PersonID int, SystemID int, EntitlementID int, TargetID int)

@Connector table (TargetName varchar(10), fConnector bit)

第一个表存储的记录告诉我,哦,这个人有这个系统,它是由这些权利组成的,谁有这些目标。有点复杂,但请跟着我。第二个存储 TargetName,然后存储该目标在我的不太理论的系统中是否有连接器。

我想做的是合并这两个表,以便我可以看到 @pset 中每行的目标标志。正如您将看到的,这将对我以后有所帮助。

如果系统中的每个权利都有一个连接到目标的连接器(对于所有这些权利,标志均为 true),那么我想知道。

所有其他人都应该进入不同的表。

这是我尝试做的事情,但没有成功。我需要知道我哪里出错了。希望比我更有经验的人能够回答。

-- If the count(123) = 10 (ten rows with SystemID = 123) and the sum = 10, cool.
select pset.*, conn.fConnector from @pset pset
inner join vuTargets vt
on vt.TargetID = pset.TargetID
inner join @conn conn
on conn.TargetName = vt.TargetName
group by ProfileID, SystemRoleID, EntitlementID, TargetID, fConnector
having count(SystemID) = sum(cast(fConnector as int))
order by ProfileID

-- If the count(123) = 10 (ten rows with SystemID = 123) and the sum <> 10
select pset.*, conn.fConnector from @pset pset
inner join vuTargets vt
on vt.TargetID = pset.TargetID
inner join @conn conn
on conn.TargetName = vt.TargetName
group by ProfileID, SystemRoleID, EntitlementID, TargetID, fConnector
having count(SystemID) <> sum(cast(fConnector as int))
order by ProfileID

不幸的是,这些不起作用:(

编辑

enter image description here

这是显示问题的屏幕截图。请注意,ProfileID 1599 的 SystemID 为 1126567,但其中一项权利没有连接器!如何将这两行放入第二个查询中? (上)

最佳答案

您的基本问题是您正在尝试汇总两个不同的记录集。
初始集合(SELECTGROUP BY 子句)表示您希望集合 [ProfileId、SystemId、EntitlementId、TargetId、fConnector] 中的每个差异都有一条记录。
第二组(HAVING 子句)表示您希望将初始组中的每一行与 COUNT 进行比较。 SUM 的记录连接数。但是,由于您要求分组到单个标志,因此这会产生每个标志的单行效果(假设一对一关系) 。实际上,你是在说 - '嘿,这个目标是否有联系?是的,我想要它。

您似乎想要是汇总到 SystemId值(value)。为此,您需要更改 SELECTGROUP BY子句仅包含 [ProfileId, SystemId] 集。这将仅返回所有目标均已“连接”的行(从配置文件和系统键入)。您将无法看到各个权利、目标以及它们是否已连接(您将能够推断它们都将连接/未连接,但是)。

<小时/>

编辑:

为了充分披露,您可以通过以下方式获得与原始结果集类似的结果,其中列出了所有 EntitlementIdTargetId s:

WITH all_connections as (SELECT pset.ProfileId, pset.SystemRoleId
FROM @pset pset
INNER JOIN vuTargets vt
ON vt.TargetId = pset.TargetId
INNER JOIN @conn conn
ON conn.TargetName = vt.TargetName
GROUP BY pset.ProfileId, pset.SystemRoleId
HAVING COUNT(pset.SystemRoleId)
= SUM(CAST(fConnector as INT)))

SELECT pset.*
FROM @pset pset
JOIN all_connections conn
ON conn.ProfileId = pset.ProfileId
AND conn.SystemRoleId = pset.SystemRoleId

这应该会为您提供一个列表,一直到 TargetId ,共 ProfileId/SystemRoleId键全部 EntitlementIdTargetId s 有连接(或者,对于那些并非全部都有连接的情况,将 CTE = 翻转为 <>)。

关于sql - 在 SQL 中正确使用 Count() 和 Sum() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7930700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com