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