由不同的人过滤相同的付款 - SQL

时间:2015-03-27 09:19:12

标签: sql sql-server-2008

你可以帮我解决以下问题:

我有一张表Payments

Id  ROLE    Payment
1   A       100
1   A       100
1   R       50
1   R       50
1   R       50
2   A       100
2   A       100
2   R       50
2   R       50
2   R       100

现在ID是一笔现金贷款(所以我们有两个)。角色A / R意味着有两个ppls支付贷款(A-one guy,R-second guy)。

现在我需要汇总特定ID的所有付款,这仍然可以,但是当角色A的付款与角色R的付款相同时,我只想为SUM计算其中一个..

我试图在同一个表上使用内部联接来解决它,其中id和payment是相同的,角色不同但仍有问题,当我有这个:

2   A   100
2   A   100
2   R   100

结果不是100而是200(我将计算(A100,R100)= 100,A100 = 100)

感谢您的帮助

更新: @Giorgi Nakeuri - 举个例子,结果应该像:

ID     Payment
1      350
2      300

更新:为了更好地理解:在给定的例子中(对于id 2)我有100支付R和A所以我们只计算一次= 100,然后我只有一个100支付A = 100,两个支付50只对于R = 100,100 + 100 + 100 = 300付款为id 2

2 个答案:

答案 0 :(得分:0)

您是否尝试区分查询?

yourTable中选择不同的 yourField

答案 1 :(得分:0)

尝试:

DECLARE @t TABLE ( ID INT, R CHAR(1), P INT )
INSERT  INTO @t
VALUES  ( 1, 'A', 100 ),
        ( 1, 'A', 100 ),
        ( 1, 'R', 50 ),
        ( 1, 'R', 50 ),
        ( 1, 'R', 50 ),
        ( 2, 'A', 100 ),
        ( 2, 'A', 100 ),
        ( 2, 'R', 50 ),
        ( 2, 'R', 50 ),
        ( 2, 'R', 100 );

WITH    cte
          AS ( SELECT   id ,
                        P ,
                        SUM(CASE WHEN R = 'A' THEN 1 ELSE 0 END) cd1 ,
                        SUM(CASE WHEN R = 'R' THEN 1 ELSE 0 END) cd2
               FROM     @t
               GROUP BY id ,
                        P
             )

    SELECT  ID ,
            SUM(P * CASE WHEN cd1 > cd2 THEN cd1 ELSE cd2 END) AS Sum
    FROM    cte
    GROUP BY ID

输出:

ID  Sum
1   350
2   300