2016-09-23 112 views
0

我有一个大致如下两个表:如何在SQL中每次只有一次SUM SUM?

表A

DocumentId (*is unique) DocumentDate 
1      2016-01-01 
2      2016-01-01 
3      2016-02-01 
4      2016-03-01 

和表B

ContractId SnapshotTimeId NetFinanced 
1   20160231  300 
1   20160331  300 
1   20160431  300 
2   20160231  450 
2   20160331  450 
2   20160431  450 
3   20160331  500 
3   20160431  500 
4   20160431  150 

我想决赛桌看起来是这样的:

DocumentDate NetFinanced 
2016-01-01 750 
2016-02-01 500 
2016-03-01 150 

我试过以下它不起作用:

SELECT A.DocumentDate, SUM(B.NetFinanced) 
FROM A 
JOIN B on B.ContractId=A.DocumentId 
GROUP BY A.DocumentDate 

任何想法?在此先感谢

+0

你应该阅读有关'GROUP BY'。 – DavidG

+0

是日期时间还是日期字段? – GuidoG

+0

输出结果如何?你能解释一下吗? – Susang

回答

1

你可以使用不同的

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) 
FROM A 
     JOIN (SELECT DISTINCT 
         ContractId, 
         NetFinanced 
       FROM  B 
      ) B ON B.ContractId = A.DocumentId 
GROUP BY A.DocumentDate 

这样做的结果会有所不同,如果NetFinanced量每SnapshotTimeId

,如果你想在最近NetFinanced量,您可以使用ROW_NUMBER改变( )来订购这些值。

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) 
FROM A 
     JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY ContractId ORDER BY SnapshotTimeId DESC) Rn, 
         ContractId, 
         NetFinanced 
       FROM  B 
      ) B ON B.ContractId = A.DocumentId AND B.Rn = 1 
GROUP BY A.DocumentDate 
0

你有你想要什么NetFinanced重复值表B,当然结果不会给你。您需要从表B加入与ContractIdNetFinanced列中的唯一值(我假设)表A:

SELECT A.DocumentDate, 
     SUM(B.NetFinanced) NetFinanced 
FROM dbo.TableA A 
INNER JOIN (SELECT DISTINCT ContractId, NetFinanced 
      FROM dbo.TableB) B 
    ON A.DocumentId = B.ContractId 
GROUP BY A.DocumentDate; 
0

尝试像这样

SELECT A.DocumentDate, SUM(B.NetFinanced) 
FROM A 
JOIN (SELECT MAX(ContractId) ContractId, MAX(SnapshotTimeId)SnapshotTimeId, 
      MAX(NetFinanced)NetFinanced 
     FROM B GROUP BY ContractId) B ON B.ContractId = A.DocumentId 
GROUP BY A.DocumentDate