2012-04-06 2 views
4

Aus der Tabelle unten für jede IssID-FeldID-Gruppe möchte ich die Zeile auswählen, die den niedrigsten ChgGrpID-Wert enthält, wenn in der Zeile eine Zeile vorhanden ist Gruppe, dass dieses Feld NULL ist, dann wählen Sie immer noch den niedrigsten Nicht-Null-Wert. Wenn nur eine Zeile mit NULL existiert, wählen Sie diese Zeile für die Gruppe aus.Auswählen von Zeilen innerhalb einer Gruppe basierend auf einem Feld, das einen Wert haben kann oder null ist

create table #Projects 
(ProjectID int, IssID int, PtID int, PTY varchar(10), TypeID int, TypeName varchar(20), FieldID int, FieldName varchar(20),   STRINGVALUE varchar(50), NUMBERVALUE int,ChgGrpID int,ChgGrpIssID int,ChgItemID int,ChgItemGrpID int,FIELD varchar(20),   NEWVALUE varchar(20), NEWSTRING varchar(20)) 
insert into #Projects values 
(10879,107930,3,'Super',22,'A',10648,'ADH',NULL,666,501040,107930,852895,501040,'ADH',NULL,'666') 
,(10879,107930,3,'Super',22,'A',10571,'DLV','No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10541,'CMPLX','Large',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10542,'EWF','Orange',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10654,'WKFL','UAT',NULL,501034,107930,852889,501034,'WKFL','DVP','CRV') 
,(10879,107930,3,'Super',22,'A',10654,'WKFL','UAT',NULL,501037,107930,852892,501037,'WKFL','CRV','UAT') 
,(10879,107930,3,'Super',22,'A',10654,'WKFL','UAT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10648,'ADH',NULL,999,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10571,'DLV','No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10541,'CMPLX','Large',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10542,'EWF','Orange',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10654,'WKFL','UAT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 


select * from #Projects 
order by IssID, FieldID 

Hier ist das Ergebnis, das ich sehen möchten:

insert into #Projects values 
(10879,107930,3,'Super',22,'A',10648,'ADH',NULL,666,501040,107930,852895,501040,'ADH',NULL,'666') 
,(10879,107930,3,'Super',22,'A',10571,'DLV','No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10541,'CMPLX','Large',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10542,'EWF','Orange',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107930,3,'Super',22,'A',10654,'WKFL','UAT',NULL,501034,107930,852889,501034,'WKFL','DVP','CRV') 
,(10879,107971,3,'Super',103,'B',10648,'ADH',NULL,999,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10571,'DLV','No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10541,'CMPLX','Large',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10542,'EWF','Orange',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
,(10879,107971,3,'Super',103,'B',10654,'WKFL','UAT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 
+0

Ich hasse Fragen wie diese. Nichts für ungut, aber hier sind meine Hausaufgaben für mich. Kannst du versuchen, es ein bisschen aufzubrechen und es zu versuchen und zurückzuschicken, was du wirklich brauchst? – JonH

+0

Es sind keine Hausaufgaben und ich frage nur nach einem Ratschlag. Im Wesentlichen muss ich Zeilen innerhalb einer Gruppe auswählen, wo ein Feld einen Wert haben kann oder NULL, wenn es mehr als eine Zeile gibt und eine NULL in dem Feld hat, wähle die Zeile mit dem kleinsten NON-NULL-Wert. Wenn nur eine Zeile mit NULL im Feld ist, dann wählen Sie diese Zeile. –

+0

Hier ist die Antwort: 'select * from ( \t select *, row_number() über (Partition durch IssID, CustomFieldID Auftrag von Isnull (ChgGrpID, 2147483647)) als rn \t von #Project \t ) p wo rn = 1' –

Antwort

0

Der erste Trick ist, dass NULL-Werte sind die letzten Werte verlesen von min sind - sie sind größer als jede Zahl für min(), und kleiner als jede Zahl für max(). Dies bedeutet, dass Ihr gewünschtes Verhalten der Standard ist.

Der zweite Trick ist, dass Sie Nullen nicht verbinden können, also müssen Sie isnull() verwenden. (Wenn es möglich ist, eine ID von -1 zu haben, müssen Sie einen anderen Ersatzwert wählen.)

So finden wir unsere Mindestwerte und die anderen Elemente im Schlüssel, dann verwenden Sie dies als Unterabfrage, um die auszuwählen Reihen, die wir wollen:

Select p.* from #Projects p 
join 
(Select isnull(MIN(ChgGrpID),-1) as ChgGrpID, IssID, FieldID 
from #Projects 
group by IssID, FieldID) X 
on isnull(P.ChgGrpID,-1)=X.ChgGrpID and P.IssID=X.IssID and P.FieldID=X.FieldID 
Verwandte Themen