2017-01-06 28 views
2

我有ProducerName一個表和ProducerRequirementsListID如何循環查看每條記錄並查看是否缺少3個要求中的任何一個?

enter image description here

每個ProducerName應該有3項要求(1,2,3),但其中一些可能丟失它們中的至少一個:或者1,2或3. 那麼我怎樣才能捕獲到至少缺少ProducerRequirementsListIDProcucerName

理想的情況下將創建3分新列Req_1Req_2Req_3併爲每個獨特的ProducerName顯示TRUEFALSE 類似的東西:

enter image description here

我應該使用WHILE環路這樣的操作?

+4

不,你絕對不應該爲此使用循環。循環是非常糟糕的,效率低下,應該儘量避免,主要是郵件合併或一些管理任務。 –

+4

我會敦促你在這裏規範你的結構。反覆重複ProducerName會變得非常成問題。如果你有超過1個同名的話會發生什麼?或者當您需要更改名稱時會發生什麼,因爲輸入的名稱不正確?您必須更新Producer表中的所有行而不是1行。 –

+0

謝謝#Sean。我贊同你。我們正在努力使結構正常化。謝謝 – Oleg

回答

2

我會說一個關鍵將是你在找什麼。簡單的自我提取示例。雖然循環雖然有用,但不應該作爲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 
+0

太棒了。非常感謝你! – Oleg

+0

沒有問題,愉快的編碼。 – djangojazz

+0

幹得好! Plus1 –

1

您可以使用快速case語句....

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 
+0

感謝#scsimon,但一些製作者有不止一個相同的要求。 'sum()'可能不會在這裏工作。但這個想法是驚人的。謝謝 – Oleg

+0

@oleg不用擔心...我給了你兩個其他的解決方案。 MEH。 – scsimon

3

目前尚不清楚,你實際上是試圖得到一個支點,或者你正在尋找只爲ProducerName被遺漏的需求。假設後者,那麼你所要做的就是分組和篩選less than 3。例如:

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

給了我60秒,但正是我想的 – scsimon

相關問題