2

Я хочу выбрать 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)

1 ответ1

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .