2017-10-12 6 views
1

私は、その1つの部分のフラグがすべて偽である部分のリストを返すクエリを考え出しています。返されるリストは、その部分。Return 1 IDがすべてfalseの場合のレコード

Part Revision Flag 
Part1| A  | true 
Part1| B  | false 
Part2| C  | false 
Part2| D  | false 
Part2| E  | false 
Part3| A  | true 
Part4| F  | false 

出力:

Part    Revision    Flag 
Part2| C(or any other revision)  | false 
Part4| F        | false 

彼らは出力されませんので、パート1とパート3をtrueに設定し、少なくとも1つのフラグを持っています。 Part2と4にはフラグは全くありません.Per2はすべての場合に1行しか返しません。

SELECT DISTINCT [PartNum],[RevisionNum],[Flag] 
     FROM [Prod].[Erp].[PartRev] 
     WHERE RevisionNum is not null AND Approved = 0 
ORDER BY PartNum 
GROUP BY [PartNum],[RevisionNum],[Flag] 

これまでのところ私は、部品番号ごとに1つの行を取得することができますが、それはその部品番号のための他のいずれかに該当する場合でも、1行のみが返されます。返される何

Part Revision Flag 
Part1| B  | false 
Part2| C  | false 
Part4| F  | false 

誰もがこの問題を解決する方法を知っていますか?

+2

[タグ:rdbms]あなたは使っていますか? – Mureinik

+0

同じパーツIDの正の行をチェックするには、サブクエリまたは自己参照結合が必要な場合があります。または、あなたのRDBMSによっては、より良い方法があるかもしれません。 – ADyson

+0

@Mureinik SQL Server Management Studio – bubbajake00

答えて

1

まず、第1のクエリに含まれていないすべての個別のレコードを選択し、フラグを持っているすべてのレコード=真

SELECT DISTINCT Part FROM PartRev WHERE flag = 1 --or whatever your RDBMS uses for a true value 

を選択します。 case文ができるためので、クエリは、別のオプションにこの

SELECT Part, MIN(Revision), flag 
FROM PartRev WHERE Part NOT IN (
    SELECT DISTINCT Part FROM PartRev WHERE flag = 1 
) 
GROUP BY Part, flag 
+0

これはかなりシンプルだったし、今は動作している!私はこの数日間、このことを見てきたので、私の欲求不満を解決してくれてありがとう! – bubbajake00

0

WHERE NOT EXISTSでこれを実行して、trueフラグを持つレコードをプルしないようにすることができます。

また、ROW_NUMBER()で完了し、最新のレコードだけを選択すると、レコードが返されたときに最新のリビジョンを取得したいようです。

;With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By Part Order By Revision Desc) As RN 
    From [Prod].[Erp].[PartRev] P1 
    Where RevisionNum is not null 
    And  Approved = 0 
    And Not Exists 
    (
     Select * 
     From [Prod].[Erp].[PartRev] P2 
     Where P1.Part = P2.Part 
     And  P2.Flag = 'true' 
    ) 
) 
Select Part, Revision, Flag 
From Cte 
Where RN = 1 
1

よう

Select Part 
     ,Revision = max(Revision) 
     ,Flag  = max(flag) 
from YourTable 
Group By Part 
Having max(Flag)='false' 

戻り、より一般的な製剤として、このような何か、についてどのように

Part Revision Flag 
Part2 E   false 
Part4 F   false 
0

を、見えますかなり複雑になりました:

SELECT 
SP.Part 
, SP.Revision 
, SP.Flag 
FROM ( 
    SELECT 
     Part 
     , Count(Part) as TC 
     , SUM(CASE Flag WHEN 1 THEN 0 ELSE 1 END) FC 
     , MAX(Revision) AS Revision 
     , MAX(flag) AS Flag 
    FROM test 
    GROUP BY Part 
    ) SP 
WHERE SP.TC=SP.FC 
関連する問題