2017-10-12 1 views
1
sind

Ich versuche, eine Abfrage, die eine Liste der Teile zurückgibt, wo alle Flags für diesen einen Teil falsch sind, und die zurückgegebene Liste sollte nur einen Datensatz zurückgegeben haben dieser Teil.Return 1 Record, wenn alle für ID ID

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

Ausgang:

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

Teil1 und Teil3 haben mindestens 1-Flag auf true gesetzt, so dass sie nicht bekommen, ausgegeben. Part2 und 4 haben keine Flags, die auf "true" gesetzt sind, und Part2 gibt nur eine Zeile für alle zurück.

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] 

Bisher kann ich eine Zeile pro Teilnummer bekommen, aber es wird nur eine Zeile zurückgeben, auch wenn eine der anderen für diese Teilnummer wahr ist.

Was wird zurückgegeben:

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

Wer weiß, wie dieses Problem beheben?

+2

Was? [tag: rdbms] verwendest du? – Mureinik

+0

benötigen Sie möglicherweise eine Unterabfrage oder eine selbstverweisende Verknüpfung, um nach positiven Zeilen für die gleiche Teil-ID zu suchen. Oder in Abhängigkeit von Ihrem RDBMS gibt es möglicherweise einen besseren Weg – ADyson

+0

@Mureinik Sql Server Management Studio – bubbajake00

Antwort

1

Wählen Sie zunächst alle Datensätze, die Flagge haben = true

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

Dann wählen Sie alle verschiedene Datensätze, die in der ersten Abfrage nicht enthalten sind. Also, schauen die Abfrage würde wie diese

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

Das war ziemlich einfach und ich habe es jetzt funktioniert! Ich habe mir das in den letzten Tagen immer wieder angesehen, also danke, dass du meine Frustration gelöst hast! – bubbajake00

0

Sie können dies mit einem WHERE NOT EXISTS tun, um keine Datensätze mit einem true Flag zu ziehen.

Es sieht auch so aus, als ob Sie die neueste Revision für das Teil abrufen möchten, wenn der Datensatz zurückgegeben wird. Dies kann über ROW_NUMBER() erfolgen und nur den neuesten Datensatz auswählen.

;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

Eine weitere Option

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

Returns

Part Revision Flag 
Part2 E   false 
Part4 F   false 
0

Wie wäre es so etwas, wie eine allgemeinere Formulierung, weil der Fall Anweisung kann sein ziemlich komplex gemacht:

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 
Verwandte Themen