【问题标题】:How can I loop through each Record and see if any of 3 requirements are missing?如何遍历每条记录并查看是否缺少 3 个要求中的任何一个?
【发布时间】:2017-05-21 16:13:52
【问题描述】:

我有一张桌子,上面有 ProducerNameProducerRequirementsListID

每个ProducerName 应该有 3 个要求(1,2,3),但其中一些可能至少缺少其中一个:1、2 或 3。 那么我怎样才能捕捉到唯一的ProcucerName 至少缺少一个ProducerRequirementsListID

理想情况下将创建 3 个新列 Req_1,Req_2 Req_3 并为每个唯一的 ProducerName 显示 TRUEFALSE 类似的东西:

我应该使用WHILE 循环来进行这样的操作吗?

【问题讨论】:

  • 不,你绝对不应该为此使用循环。循环是非常低效的,应该避免,除了极少数例外,主要是邮件合并或一些管理任务。
  • 我会敦促你在这里规范你的结构。一遍又一遍地重复 ProducerName 会变得非常有问题。如果您有超过 1 个同名,会发生什么?或者当您因为输入错误而需要更改名称时会发生什么?您必须更新 Producer 表中的所有行而不是 1 行。
  • 谢谢#Sean。我同意你的看法。我们正在努力使结构正常化。谢谢

标签: sql-server tsql while-loop


【解决方案1】:

您可以使用快速案例陈述......

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

这里有一个更好的方法,使用来自 django 的测试数据,来找出丢失的那个...

select 
    ProducerName
    ,case 
        when sum(ProducerRequirementListID) = 3 then 3
        when sum(ProducerRequirementListID) = 4 then 2
        when sum(ProducerRequirementListID) = 5 then 1
        when sum(ProducerRequirementListID) = 6 then NULL
    end as MissingReq
from ProducerTable
group by ProducerName

测试数据

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

【讨论】:

  • 谢谢#scsimon,但有些制作人有不止一个相同的要求。 sum() 可能不会在这里工作。但这个想法是惊人的。谢谢
  • @oleg 不用担心......我还给了你另外两个解决方案。嗯。
【解决方案2】:

不清楚您实际上是在尝试获得一个支点,或者您只是在寻找缺少要求的ProducerName。假设是后者,那么您需要做的就是按less than 3 分组和过滤。例如:

SELECT ProducerName
FROM Table
GROUP BY ProducerName
HAVING COUNT(*) < 3

【讨论】:

  • 在 60 秒内找到了我,但正是我的想法
【解决方案3】:

我想说一个支点就是您要寻找的。简单的自提取示例。虽然循环很有用,但不应作为 SQL 中的第一选择,因为它是基于结果集的语言,并且当在 while 循环中执行可以使用枢轴完成的操作时,性能可能会随着时间的推移而变差。

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

【讨论】:

  • 太棒了。非常感谢!
  • 没有问题,愉快的编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多