Как выбрать строки в MS SQL на основе значений столбцов?

373
Tech Sawi

Я хочу выбрать SourceId & Currency на основе значения Count. Проблема в наборе. Я должен игнорировать все данные, где Count = 0, если есть какое-либо значение больше 0, но если все значения в группе равны 0, тогда необходимо учитывать все значения.

Образец 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 

Образец 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 

Я пробовал агрегировать функции, группируя данные по-разному, но, похоже, ничего не получалось. Я использую SQL 2008, если это помогает.

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 ответ на вопрос

0
Tech Sawi

Наконец нашел решение моей проблемы, это работает для моей проблемы, которую я отправил выше

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 

Похожие вопросы