Como escolher linhas no MS SQL com base nos valores das colunas?

2

Eu quero escolher o SourceId & Moeda baseada no valor de contagem. O problema está dentro de um conjunto Eu tenho que ignorar todos os dados onde Count = 0, se houver algum valor maior que 0, mas se todas as contagens forem 0 dentro de um grupo, então, considere todos os valores.

Amostra 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

Amostra 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

Eu tentei Agregar funções, agrupando dados de maneiras diferentes, mas nada parece funcionar. Estou usando o SQL 2008, se isso ajuda.

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)
    
por Tech Sawi 18.02.2015 / 12:02

1 resposta

0

Finalmente encontrei a solução para o meu problema, funciona para o meu problema que eu postei acima

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
    
por 18.02.2015 / 17:22