Sql server 我如何循环查看每个记录并查看是否缺少3个要求中的任何一个?

Sql server 我如何循环查看每个记录并查看是否缺少3个要求中的任何一个?,sql-server,tsql,while-loop,Sql Server,Tsql,While Loop,我有一个带有ProducerName和ProducerRequirementsListID 每个ProducerName应该有3个需求(1,2,3),但其中一些可能至少缺少其中一个:1、2或3。 那么,如何捕获唯一的proucername,它至少缺少一个ProducerRequirementsListID 理想情况下,将创建3个新列Req_1,Req_2Req_3,并为每个唯一的ProducerName显示TRUE或FALSE 诸如此类: 我应该使用而循环进行类似的操作吗?我想说,您正在寻找

我有一个带有
ProducerName
ProducerRequirementsListID

每个
ProducerName
应该有3个需求(1,2,3),但其中一些可能至少缺少其中一个:1、2或3。 那么,如何捕获唯一的
proucername
,它至少缺少一个
ProducerRequirementsListID

理想情况下,将创建3个新列
Req_1
Req_2
Req_3
,并为每个唯一的
ProducerName
显示
TRUE
FALSE
诸如此类:


我应该使用
循环进行类似的操作吗?

我想说,您正在寻找的是一个枢轴。简单的自解压示例。虽然While循环很有用,但不应作为SQL中的首选方法,因为它是基于结果集的语言,在While循环中执行pivot可以执行的操作时,随着时间的推移,性能可能会很差

DECLARE @People TABLE (PersonName VARCHAR(128), Ord INT);

INSERT INTO @People (PersonName, Ord) VALUES ('Brett', 1), ('Brett', 2), ('Brett', 3), ('Emily', 1), ('Emily', 2);

SELECT
    PersonName
, [1] as FirstValue
, [2] as SecondValue
, [3] as ThirdValue
From @People
    PIVOT ( Count(Ord) FOR Ord IN ([1],[2],[3])) AS piv

你可以使用一个快速的案例陈述

select 
    ProducerName
    ,case when ProducerRequirementListID = 1 then 'TRUE' else 'FALSE' end as Req1
    ,case when ProducerRequirementListID = 2 then 'TRUE' else 'FALSE' end as Req2
    ,case when ProducerRequirementListID = 3 then 'TRUE' else 'FALSE' end as Req3
from ProducerName
这里有一个方法可以得到一个缺少一个制片人的名单

select ProducerName
from ProducerTable
group by ProducerName
having count(ProducerName) < 3
测试数据

DECLARE @People TABLE (PersonName VARCHAR(128), Ord INT);

INSERT INTO @People (PersonName, Ord) VALUES ('Brett', 1), ('Brett', 2), ('Brett', 3), ('Emily', 1), ('Emily', 2), ('Jake', 1), ('Jake', 3);

SELECT 
    PersonName,
    case 
        when sum(Ord) = 4 then 2
        when sum(Ord) = 3 then 3
        when sum(Ord) = 5 then 1
        when sum(Ord) = 6 then NULL
    end as MissingReq
from @People
group by PersonName

现在还不清楚您是否真的试图获得一个支点,或者您只是在寻找缺少需求的
ProducerName
。假设是后者,那么您只需按小于3的
进行分组和筛选即可。例如:

SELECT ProducerName
FROM Table
GROUP BY ProducerName
HAVING COUNT(*) < 3
选择ProducerName
从桌子上
按ProducerName分组
计数(*)小于3的

不,您绝对不应该为此使用循环。循环非常低效,应该避免,只有极少数例外,主要是邮件合并或一些管理任务。我敦促您在这里规范您的结构。一次又一次地重复ProducerName可能会产生很大的问题。如果有多个同名的文件,会发生什么情况?或者,如果由于输入错误而需要更改名称,会发生什么情况?您必须更新Producer表中的所有行,而不是1行。谢谢#Sean。我同意你的看法。我们正在努力使结构正常化。谢谢你给了我60秒,但正是我所想的。非常感谢你!没问题,愉快的编码。谢谢#scsimon,但有些制作人有不止一个相同的要求
sum()
在这里可能不起作用。但这个想法是惊人的。Thanks@oleg别担心。。。我也给了你另外两个解决方案。无聊的。
SELECT ProducerName
FROM Table
GROUP BY ProducerName
HAVING COUNT(*) < 3