如何根据列值在 MS SQL 中选择行?

如何根据列值在 MS SQL 中选择行?

我想根据计数值选择 SourceId 和 Currency。问题是,在一个集合中,如果有任何值大于 0,我必须忽略所有 Count = 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

最后找到了我的问题的解决方案,它对我上面发布的问题有用

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

相关内容