【问题标题】:Sum a column that corresponds a aggregate from a column of another table对与另一个表的列的聚合相对应的列求和
【发布时间】:2013-09-24 19:59:27
【问题描述】:

抱歉标题,但我想不出更好的主题来解决我的问题。

我有两个表,它们之间存在多对一关系,同一张表中还有另一个多对一关系。我需要对与第一个表的列中的聚合相对应的列求和。

这是一个说明我想要什么的图片:

我不知道该怎么做。

【问题讨论】:

    标签: sql sql-server sum aggregate-functions


    【解决方案1】:

    应该这样做:

    SELECT  ISNULL(E.idParent,E.id) Id,
            SUM(I.Value) [Sum]
    FROM EXPENSE_TABLE E
    LEFT JOIN INVOICE_TABLE I
        ON I.idExpense = E.id
    GROUP BY ISNULL(E.idParent,E.id)
    

    对于更新的需求:

    SELECT  ISNULL(E.idParent,E.id) Id,
            E2.[description],
            SUM(I.Value) [Sum]
    FROM EXPENSE_TABLE E
    LEFT JOIN INVOICE_TABLE I
        ON I.idExpense = E.id
    INNER JOIN EXPENSE_TABLE E2
        ON ISNULL(E.idParent,E.id) = E2.id
    GROUP BY ISNULL(E.idParent,E.id),
             E2.[description]
    

    【讨论】:

    • 我也需要显示费用父项的描述...但是如果我添加列,则会出现错误。我该怎么做?
    • @dellasavia 好吧,费用表上每个 id 的描述都不同,所以我真的不知道你想如何添加该列。也许如果您显示所需的输出,我可以理解您想要什么
    • 请@Lamak 帮我解决其他问题:link。与这个问题有关。
    • +1,除了我使用内连接而不是左连接之外,我的答案是相同的,因为EXPENSE_TABLE 中的父行似乎在INVOICE_TABLE 中没有数据。结果,我也不需要 ISNULL 。 (不过,我意识到人们有时会提供不完整的数据样本,所以我也会在我的回答中说明我的所有假设。)
    • @AndriyM 是的,我假设如果一项费用可能没有孩子,那么它可能只会出现一次而没有父母
    【解决方案2】:

    您可以通过对连接到 INVOICE_TABLE 的 EXPENSE_TABLE 的结果执行聚合求和操作来获得您要查找的结果。

    例如:

    SELECT e.idParent, SUM(i.value)
    FROM EXPENSE_TABLE AS e
    INNER JOIN INVOICE_TABLE AS i ON i.idExpense = e.id
    GROUP BY e.idParent
    ORDER BY e.idParent
    

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多