【问题标题】:How to SUM Only One Time Per UniqueId in SQL?如何在 SQL 中对每个 UniqueId 只求和一次?
【发布时间】: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
  • 是日期时间还是日期字段?
  • 输出会怎样?你能解释一下吗?

标签: sql sql-server sql-server-2005


【解决方案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 中 ContractIdNetFinanced 列的唯一值(我假设)加入 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        相关资源
        最近更新 更多