SQL Server 2008的T-SQL查询:如何查询X行,其中X是查询中的一个值,同时匹配另一列

SQL Server 2008的T-SQL查询:如何查询X行,其中X是查询中的一个值,同时匹配另一列,sql,sql-server-2008,select,Sql,Sql Server 2008,Select,总结: 我有一个试图分配给工作人员列表的工作项列表。每个工作最多只能分配100个工作项。每个工作项指定应作为所有者对其进行关联的用户 例如: Jim总共有5个账户,每个账户有多个工作项。吉姆总共有50项工作已经分配给他了。我只允许再分配50个 我的困境/目标: 我使用一个临时表和一个select语句来获取每个所有者当前分配给他们的项目的数量,我计算新项目的可用插槽,并将值存储在新列中。我需要能够从items表中进行选择,其中所有者与我的所有者列表及其临时表中的可用项目相匹配,仅检索每个用户的行数

总结:

我有一个试图分配给工作人员列表的工作项列表。每个工作最多只能分配100个工作项。每个工作项指定应作为所有者对其进行关联的用户

例如:

Jim总共有5个账户,每个账户有多个工作项。吉姆总共有50项工作已经分配给他了。我只允许再分配50个

我的困境/目标:

我使用一个临时表和一个select语句来获取每个所有者当前分配给他们的项目的数量,我计算新项目的可用插槽,并将值存储在新列中。我需要能够从items表中进行选择,其中所有者与我的所有者列表及其临时表中的可用项目相匹配,仅检索每个用户的行数等于每个用户的可用插槽数-对于jim,即使可能有200行符合条件,查询也只会返回50行,而sam可能会得到0行,因为他没有可用插槽,而items表中有30个项目可供他使用

我意识到我处理这个问题的方法可能是错误的。我想避免使用光标

编辑:添加一些示例代码

SELECT
nUserID_Owner
,   CASE
        WHEN COUNT(c.nWorkID) >= 100 THEN 0
        ELSE 100 - COUNT(c.nWorkID)
    END
,COUNT(c.nWorkID)   
FROM tblAccounts cic
LEFT JOIN tblWorkItems c
ON c.sAccountNumber = cic.sAccountNumber
AND c.nUserID_WorkAssignedTo = cic.nUserID_Owner
AND c.nTeamID_WorkAssignedTo = cic.nTeamID_Owner
WHERE cic.nUserID_Collector IS NOT NULL
AND nUserID_CurrentOwner = 5288
AND c.bCompleted = 0
GROUP BY nUserID_Owner

在Jim的场景中,这提供了5288、50、50的输出值

花费的时间比我希望的要长,但我找到了解决方案

正如上面所建议的,我确实使用了一个子查询来生成具有用户唯一行计数的工作项

我使用partitionby为每个worker生成一个唯一的行数,并在HAVING子句中包含行数必须<可用插槽数。我会发布代码,但它超出了字符限制,而且我还有很多东西需要在系统上正确更改


最初,我处理这个问题的方式不正确,只关注结果的限制,而没有考虑创建必要的数据来关联结果集。

是否可以加入或子查询?表结构?我打赌你也可以摆脱临时表,但我们需要知道你的数据是如何开始的。我的数据从3个主要表开始,即用户、帐户和工作项。用户表中的pkey是用户id。这也是另一个包含帐户的表中的FK。account表有一个帐号pkey,它是工作项表中的fk。工作项表有pkey,我用它来表示一个占用一个插槽的工作项。它包含accounts表中作为fk的帐号。SELECT*FROM tblWorkItems-产生所有工作项SELECT*FROM tblUsers-产生所有用户SELECT*FROM tblAccounts-产生所有帐户我用于获得已分配工作的方法:在我的原始帖子中添加了代码,下面看起来很可怕我想在上面的查询中添加另一个连接,以在Jim的场景中获得最多X个工作项50。行数需要直接取决于计算值100-CountWorkId。