如何在 SQL 中对每个 UniqueId 只求和一次?
Posted
技术标签:
【中文标题】如何在 SQL 中对每个 UniqueId 只求和一次?【英文标题】:How to SUM Only One Time Per UniqueId in SQL? 【发布时间】:2016-09-23 15:22:17 【问题描述】:我有两张表大致如下:
表 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
有什么想法吗?提前致谢
【问题讨论】:
你应该阅读GROUP BY
。
是日期时间还是日期字段?
输出会怎样?你能解释一下吗?
【参考方案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
【讨论】:
【参考方案2】:您在 TableB 中有 NetFinanced
的重复值,当然结果不会给您想要的结果。您需要使用 TableB 中 ContractId
和 NetFinanced
列的唯一值(我假设)加入 TableA:
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;
【讨论】:
【参考方案3】:这样试试
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
【讨论】:
以上是关于如何在 SQL 中对每个 UniqueId 只求和一次?的主要内容,如果未能解决你的问题,请参考以下文章