2017-08-29 50 views
1

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

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

的数据是这样的:

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 

我需要做的是总只是EventA通过Person123支付的款项 - 总应$ 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 

感谢,

+0

那么你需要返回所有更多的列或不是?如果您想要完整的答案,最好包含所有必要的信息,以便为您提供完整的解决方案。 –

+0

通过使用personID –

+0

组是的我需要返回所有列。从提取的数据创建的表格中有132列,有点长,试图包括在这里。 'Person123'和'EventA'的其他列除了DatePaid和AmountPaid外都是相同的。没有可用于链接条目的事务标识符。 – Area51Resident

回答

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

我们有这个的赢家。谢谢!我的代表点很低显示我的upvote是隐​​藏的。 – Area51Resident

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

似乎缺少DatePaid列。 –

+0

我用子查询修改了它,现在能工作吗? – PeterH

+0

我认为它现在应该工作:s – PeterH