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