SQL仅对某些行进行SUM

时间:2017-08-29 12:54:46

标签: sql-server sql-server-2014

我正在尝试找到一种方法来在一个小数据集中加总一美元金额,但仅限于某些行。这些数据是从我无法改变的另一个系统中提取的。这将用于一次性数据导入SQL,因此非常高效且低优先级。我需要将特定人员ID为同一事件代码支付两笔或更多笔的行相加。

在数据中,除AmountPaid和DatePaid外,付款人的所有列(许多未显示)都相同。我想要SUM AmountPaid(如果可能的话,获得DatePaid的MAX)。

数据如下所示:

EventCode | PersonID | DatePaid | AmountPaid
****    
EventA | Person123 |2017-01-01 | $50
EventA | Person456 |2017-02-01 | $100
EventA | Person123 |2017-02-02 | $50
EventB | Person123 |2016-01-01 | $100
EventC | Person456 |2017-07-07 | $200
EventC | Person123 |2017-08-08 | $200

我需要做的只是Person123对EventA的支付总额 - 总计应该是100美元(50 + 50),所以我可以将其作为一次付款交易导入。

理想的结果是这样的:

EventCode | PersonID | DatePaid | AmountPaid
****    
EventA | Person456 |2017-02-01 | $100
EventA | Person123 |2017-02-02 | $100
EventB | Person123 |2016-01-01 | $100
EventC | Person456 |2017-07-07 | $200
EventC | Person123 |2017-08-08 | $200

谢谢,

2 个答案:

答案 0 :(得分:1)

试试这个,它会为你带来什么?

Select
    SQ.ID
    ,SQ.EventCode
    ,SQ.PersonID
    ,SQ.Datepaid
    ,SUM(SQ.Amountpaid)
    ,MAX(SQ.Amountpaid)

    From
    (
    Select
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) AS 'ID'
    ,EventCode
    ,PersonID
    ,Datepaid
    ,AmountPaid
    From [TableNAme]
    Group By
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) 
    ,EventCode
    ,PersonID 
    ) As SQ

Group By
    SQ.ID
    ,SQ.EventCode
    ,SQ.PersonID
    ,SQ.Datepaid

要选择所有列,以下内容可能适用于您

Select
*
    ,SUM(SQ.Amountpaid)
    ,MAX(SQ.Amountpaid)

    From
    (
    Select *
    ,Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) AS 'ID'
    From [TableNAme]
    Group By
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) 
    ,EventCode
    ,PersonID 
    ) As SQ

Group By
    SQ.ID
    ,SQ.EventCode
    ,SQ.PersonID
    ,SQ.Datepaid

答案 1 :(得分:1)

如果您在评论中提到的表格中有更多列,而且这是一次tassk,您可以尝试以下

SELECT   DISTINCT
  EventCode,
  PersonID,
  DatePaid = (SELECT MAX(DatePaid) FROM YourTable t2 WHERE t1.EventCode = t2.EventCode AND t1.PersonID = t2.PersonID) ,
  AmountPaid= (SELECT SUM(AmountPaid) FROM YourTable t2 WHERE t1.EventCode = t2.EventCode AND t1.PersonID = t2.PersonID)
  //select other 100+ columns
FROM YourTable t1