如何根据列值选择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)
科技芥末

最后找到我的问题的解决方案,它可以解决我上面发布的问题

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章