【问题标题】:how to adjust the sum() of a group using the sum() of a subgroup()如何使用 subgroup() 的 sum() 调整组的 sum()
【发布时间】:2013-08-09 16:00:49
【问题描述】:

我正在尝试使用“资产”和“交易”表获得下面第三个表中显示的输出。

我正在尝试按 Cmpy、Acct 和 AssetID 进行分组并获得总和(成本)。但是在求和之前,必须从 Transactions 表中调整每个成本。不知道该怎么做。

表格:资产

+---------+------+---------+--------+ |价格 |帐户 |资产ID |成本 | +---------+------+---------+--------+ | 50 | 120 | 109 | 100.00 | | 50 | 120 | 109 | 200.00 | | 50 | 120 | 110 | 300.00 | | 50 | 120 | 110 | 20.00 | | 50 | 121 | 107 | 150.00 | | 50 | 121 | 201 | 200.00 | +---------+------+---------+--------+

表:交易

+--------+---------+--------+ |价格 |资产ID |安特 | +--------+---------+--------+ | 50 | 109 | -50.00 | | 50 | 110 | 50.00 | | 50 | 110 | -20.00 | | 50 | 201 | -50.00 | +--------+---------+--------+

输出

+--------+------+--------+ |价格 |帐户 |总计 | +--------+------+--------+ | 50 | 120 | 600.00 | | 50 | 121 | 300.00 | +--------+------+--------+

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    这个应该会给你一个准确的答案:

    SELECT  a.Cpny,
            a.Acct,
            SUM(a.Cost + ISNULL(t.Adjustment, 0)) AS Total
      FROM  Assets a
        LEFT JOIN (SELECT  Cpny,
                           AssetID,
                           SUM(Amt) AS Adjustment
                     FROM  Transactions
                     GROUP BY Cpny, AssetID) t
          ON t.Cpny = a.Cpny AND t.AssetID = a.AssetID
      GROUP BY a.Cpny, a.Acct
    

    关联的 SQLFiddle here.

    本质上,对交易表中的调整金额求和,然后将其加入主结果列表,将成本加总和每个账户中每种资产的调整。

    【讨论】:

    • 谢谢!如果我想在加入 Transations 表之前将 Asset 表与另一个表加入,我该如何修改查询?从 AssetClass C,Asset A 中选择 A.cpnyid,A.acct,sum(cost) 其中 C.acct = a.acct 和 C.classid = A.classid 按 A.cpnyId,A.Acct 分组。我想和你一样对事务表进行左连接。
    • @stackuser 可能更容易看到您想要做的事情布局得更好 - 您可以编辑您的原始问题或制作一个新问题吗?
    【解决方案2】:

    如果 AcctAssetID 值之间的“关系”是 1 到多个,那么您可以使用此查询(效率不高):

    SELECT x.Cpny,x.Acct, SUM( ISNULL(x.Total,0) + ISNULL(y.Total,0) ) AS Total
    FROM 
    (
        SELECT  a.Cpny,a.Acct,a.AssetID, SUM(a.Cost) AS Total
        FROM    dbo.Assets a 
        GROUP BY a.Cpny,a.Acct,a.AssetID
    ) x
    LEFT JOIN
    (
        SELECT  t.Cpny,t.AssetID, SUM(t.Cost) AS Total
        FROM    dbo.Transactions t
        GROUP BY t.Cpny,t.AssetID
    ) y ON x.Cpny=y.Cpny AND x.AssetID=y.AssetID
    GROUP BY x.Cpny,x.Acct;
    

    【讨论】:

    • Transactions 表中没有“Acct”列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多