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