Sql 如何使用子组()的sum()调整组的sum()

Sql 如何使用子组()的sum()调整组的sum(),sql,tsql,Sql,Tsql,我试图使用“资产”和“交易”表获得下表三所示的输出 +----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 50 | 120 | 109 | 100.00 | | 50 | 120 | 109 | 200.00 | | 50 | 120 | 110 |

我试图使用“资产”和“交易”表获得下表三所示的输出

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ 我正在尝试按Cmpy、Acct和AssetID进行分组,并得到总数(成本)。但是,在汇总之前,必须从交易记录表中调整每项成本。不知道怎么做

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ 表:资产

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ +----------+------+---------+--------+ |Cpny |账户|资产|成本| +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ 表格:交易

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ +------+---------+--------+ | Cpny | AssetID | Amt | +------+---------+--------+ | 50 | 109 | -50.00 | | 50 | 110 | 50.00 | | 50 | 110 | -20.00 | | 50 | 201 | -50.00 | +------+---------+--------+ +------+---------+--------+ |Cpny |资产|金额| +------+---------+--------+ | 50 | 109 | -50.00 | | 50 | 110 | 50.00 | | 50 | 110 | -20.00 | | 50 | 201 | -50.00 | +------+---------+--------+ 输出

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ +------+------+--------+ | Cpny | Acct | Total | +------+------+--------+ | 50 | 120 | 600.00 | | 50 | 121 | 300.00 | +------+------+--------+ +------+------+--------+ |Cpny |科目|总计| +------+------+--------+ | 50 | 120 | 600.00 | | 50 | 121 | 300.00 | +------+------+--------+ 如果
Acct
AssetID
值之间的“关系”是1对多,则可以使用此查询(效率不高):

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+ 如果
Acct
AssetID
值之间的“关系”是1对多,则可以使用此查询(效率不高):

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+
这一条应该给你一个准确的答案:

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+
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

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+
基本上,对交易记录表中的调整金额求和,然后将其加入到主要结果列表中,将成本加上每个账户中每个资产的调整金额求和。

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

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+
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

+----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+
基本上,对交易记录表中的调整金额求和,然后将其加入主结果列表,将成本加上每个账户中每项资产的调整相加。

交易记录表中没有“账户”列交易记录表中没有“账户”列谢谢!如果我想在连接到Transactions表之前将Asset表连接到另一个表,那么如何修改查询?从资产类别C中选择A.cpnyid、A.acct、总和(成本),其中C.acct=A.acct和C.classid=A.classid按A.cpnyid、A.acct分组。我想像您一样对事务表进行左连接。@stackuser您可以更容易地看到您想做的事情,并将其布置得更好一些-您可以编辑原始问题还是生成新问题?谢谢!如果我想在连接到Transactions表之前将Asset表连接到另一个表,那么如何修改查询?从资产类别C中选择A.cpnyid、A.acct、总和(成本),其中C.acct=A.acct和C.classid=A.classid按A.cpnyid、A.acct分组。我想像您一样对事务表进行左连接。@stackuser您可以更容易地看到您想要做的事情,并将其布置得更好一些-您可以编辑原始问题还是生成新问题? +----------+------+---------+--------+ | Cpny | Acct | AssetID | Cost | +----------+------+---------+--------+ | 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 | +----------+------+---------+--------+