Wie wählt man Zeilen in MS SQL basierend auf Spaltenwerten aus?

443
Tech Sawi

Ich möchte SourceId & Currency basierend auf dem Count-Wert auswählen. Problem ist innerhalb einer Gruppe. Ich muss alle Daten ignorieren, bei denen Count = 0 ist, wenn ein Wert größer als 0 ist. Wenn jedoch alle Zählungen 0 in einer Gruppe sind, müssen alle Werte berücksichtigt werden.

Probe 1

Id(PK) SourceId SourceValue Currency Count Remarks 1 1000001 ABC EUR 70000 Pick this 2 1000002 ABC EUR 0 Ignore 3 1000003 ABC EUR 0 Ignore 4 1000002 ABC EUR 0 Ignore 5 1000003 ABC EUR 40 Pick this 6 1000001 ABC EUR 10 Pick this  7 1000004 ABC GBP 2000 Pick 8 1000004 ABC GBP 200 Pick  9 1000005 ABC USD 2000 Only pick this 

Probe 2

Id(PK) SourceId SourceValue Currency Count Remarks 1 1000001 ABC EUR 0 Pick 2 1000002 ABC EUR 0 Pick 3 1000003 ABC EUR 0 Pick 4 1000002 ABC EUR 0 Pick 5 1000003 ABC EUR 0 Pick 6 1000001 ABC EUR 0 Pick  7 1000004 ABC GBP 2000 Pick 8 1000004 ABC GBP 200 Pick  9 1000005 ABC USD 2000 Only pick this 

Ich habe Aggregatfunktionen ausprobiert, die Daten auf verschiedene Arten gruppieren, aber nichts scheint zu funktionieren. Ich verwende SQL 2008, wenn das hilft.

IF OBJECT_ID ('Tempdb..#TempTab') IS NOT NULL BEGIN DROP TABLE #TempTab END  CREATE TABLE #TempTab (Id int IDENTITY (1,1), SourceId int, SourceValue varchar(10), Currency varchar(3), Volume int)  INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000001,'ABC','EUR',70) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000002,'ABC','EUR',0) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000003,'ABC','EUR',0) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000003,'ABC','EUR',40) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000001,'ABC','EUR',10) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000004,'ABC','GBP',200) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000004,'ABC','GBP',20) INSERT INTO #TempTab(SourceId,SourceValue,Currency,Volume) VALUES(1000005,'ABC','USD',200) 
2

1 Antwort auf die Frage

0
Tech Sawi

Endlich eine Lösung für mein Problem gefunden, funktioniert es für mein Problem, das ich oben gepostet habe

SELECT * FROM ( SELECT T.Id,T.SourceId,T.Currency,T.Volume ,DENSE_RANK() OVER(PARTITION BY T.SourceValue,T.Currency ORDER BY T.TVol DESC) VolRank FROM ( SELECT t.* ,CASE WHEN t.Volume <> 0 THEN '1' ELSE '0' END TVol FROM #TempTab t ) T ) T WHERE T.VolRank = 1 -- I'm interested in only those where ranking = 1