TSQL匹配结果集中多个值的第一个实例

时间:2015-05-18 15:10:52

标签: sql-server sql-server-2008 tsql

假设我有一个大型查询的一部分,如下所示,它以随机顺序返回具有不同值信息(PolPremium)的多行相同密钥信息(PolNum)的结果集。

是否可以选择第一个匹配的PolNum字段并总结PolPremium。在这种情况下,我知道有2个PolNumber被使用,因此给出了结果集的屏幕截图(是的,我知道它从14开始用于说明目的)并返回第一个值并对结果求和。

PolNum 000035789547的第一场比赛

(ROW 14)PolPremium - 32.00

PolNum 000035789547的第一场比赛

(ROW 16)PolPremium - 706043.00

总计应为32.00 + 706043.00 = 706072.00

查询

    OUTER APPLY
        (
            SELECT PolNum, PolPremium
                FROM PN20 
                WHERE PolNum IN(SELECT PolNum FROM SvcPlanPolicyView
                                    WHERE SvcPlanPolicyView.ControlNum IN (SELECT val AS ServedCoverages FROM ufn_SplitMax(
                                                                            (SELECT TOP 1 ServicedCoverages FROM SV91 WHERE SV91.AccountKey = 3113413), ';')))
                ORDER BY PN20.PolEffDate DESC
        }

结果集

enter image description here

1 个答案:

答案 0 :(得分:0)

假设您的查询生成的最终结果为pic。然后你可以做类似的事情:

DECLARE @t TABLE
    (
      PolNum VARCHAR(20) ,
      PolPremium MONEY
    )

INSERT  INTO @t
VALUES  ( '000035789547', 32 ),
        ( '000035789547', 76 ),
        ( '000071709897', 706043.00 ),
        ( '000071709897', 1706043.00 )



SELECT  t.PolNum ,
        SUM(PolPremium) AS PolPremium
FROM    ( SELECT    * ,
                    ROW_NUMBER() OVER ( PARTITION BY PolNum ORDER BY PolPremium ) AS rn
          FROM      @t
        ) t
WHERE   rn = 1
GROUP BY GROUPING SETS(t.PolNum, ( ))

输出:

PolNum          PolPremium
000035789547    32.00
000071709897    706043.00
NULL            706075.00

只需将@t替换为您的查询即可。此外,我认为最低溢价的行是第一行。您可能会在外部应用部分中过滤顶行,但如果没有一些示例数据,我真的不清楚那里发生了什么。