Sql server SQL仅对某些行求和

Sql server SQL仅对某些行求和,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我试图找到一种方法,在一个小数据集中求和一个美元金额,但只能在某些行上求和。这些数据是从另一个系统中提取的,我无法更改。这将用于一次性将数据导入SQL,因此美观高效的优先级较低。我需要对特定人员ID为同一事件代码支付了两次或更多款项的行进行求和 在数据中,除了AmountPaid和DatePaid之外,支付人的所有列(许多未显示)都是相同的。我想合计已支付金额(如果可能的话,获得DatePay的最大值) 数据如下所示: EventCode | PersonID | DatePaid | Amou

我试图找到一种方法,在一个小数据集中求和一个美元金额,但只能在某些行上求和。这些数据是从另一个系统中提取的,我无法更改。这将用于一次性将数据导入SQL,因此美观高效的优先级较低。我需要对特定人员ID为同一事件代码支付了两次或更多款项的行进行求和

在数据中,除了AmountPaid和DatePaid之外,支付人的所有列(许多未显示)都是相同的。我想合计已支付金额(如果可能的话,获得DatePay的最大值)

数据如下所示:

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
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
我需要做的是总计Person123为EventA支付的款项-总计应为100美元(50+50),因此我可以将其作为一个支付交易导入

理想的结果如下:

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
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

谢谢,

试试这个,它能给你带来什么回报

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

如果您在注释中提到的表中有更多的列,并且是一次性TASK,您可以尝试以下方法

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

那么,您是否需要返回更多的所有列或否?如果你想得到一个完整的答案,最好包括所有必要的信息,以便为你提供一个完整的解决方案。使用personides进行分组我需要返回所有列。从提取的数据创建的表中有132列,此处尝试包含有点长。除DatePayed和AmountPayed外,“Person123”和“EventA”的其他每一列都是相同的。没有可用于链接条目的事务标识符。似乎缺少DatePaid列。我已使用子查询对其进行了修改,现在可以使用了吗?@User91504我无法使用它-上面的示例仍然为Person123返回两行。第二个问题没有解决,因为我已经在GROUP BY聚合中添加了100多个列,以查看它是否有效。尝试从select中删除SQ.ID,然后再按GROUP BY。我认为这种方法的问题是,我已经在内部select中添加了我需要分组的所有列-这不会聚合我需要求和的行。与外部分组方式类似的问题是,为了获得我拥有的每一列,我会列出每一列,这样它会将DatePaid和AmountPaid视为离散值,而不会对它们进行分组。@EricZ的样本很有效,所以我就用它。谢谢你的帮助。我们有一个赢家。非常感谢。我的代表分数很低,这表明我的投票是隐藏的。