sql - SQL Server (2008) UNION 与 ROLL UP
问题描述
我有一个费用报告应用程序,它将费用费用和帐号收集到一个表中,但是可以将给定的费用拆分为一部分记入一个 GL 帐户,其余部分记入另一个帐户。为了适应成本拆分,费用表有两对金额和帐号列,供数据输入过程使用。像这样:
create table Expenses (expheaderid int, explineid int, amount_split1 decimal(5,2),
account int, amount_split2 decimal(5,2), account2 int);
insert Expenses values (57, 11, 47.35, 80400, 0, 0);
insert Expenses values (57, 12, 163.31, 80440, 0, 0);
insert Expenses values (57, 13, 30, 80401, 5.90, 70410);
insert Expenses values (57, 14, 35, 80440, 0, 0);
insert Expenses values (57, 15, 45.15, 80440, 0, 0);
insert Expenses values (57, 16, 145.87, 80400, 68.14, 80400);
insert Expenses values (57, 17, 67.35, 80870, 0, 0);
insert Expenses values (57, 18, 105, 80402, 34.50, 80440);
我需要汇总(GROUP BY)来自相同帐户代码的金额,但汇总必须发生在两对金额和帐号列之间 - (amount_split1 & account) 第一对或 (amount_split2 & account 2) 第二列对。所以我的表是这样的:
expheaderid explineid amount_split1 account amount_split2 account2
----------- --------- ------------- ------- ------------- --------
57 11 47.35 80400 0.00 0
57 12 163.31 80440 0.00 0
57 13 30.00 80401 5.90 70410
57 14 35.00 80440 0.00 0
57 15 45.15 80440 0.00 0
57 16 145.87 80400 68.14 80400
57 17 67.35 80870 0 0
57 18 105.00 80402 34.50 80440
我想将 amount_split1 成本与 amount_split2 成本按帐号分组。
结果应如下所示,从 account 列和 account2 列中的 GL 帐户中收集
AggTotal GLAccount
-------- ---------
261.36 80400
30.00 80401
105.00 80402
277.96 80440
67.35 80470
and probably...
0.00 0 -which I don't care about.
我根本不擅长复合查询。我试图在这样的一个语句中使用 UNION 和 GROUP :
select sum(AggTotal), GLAccount from
((select amount_split1 as AggTotal, account as GLAccount from Expenses)
union all
(select amount_split2 as AggTotal, account2 as GLAccount from Expenses))as t
where Expenses.expheaderid=57 group by GLAccount;
但是 expheaderid 列不会绑定。该数据是更大数据集的一部分,因此 expheaderid 上的 WHERE 子句必须起作用。
谢谢你的帮助。
解决方案
您可以尝试UNION ALL
在子查询中添加expheaderid
列,因为您需要where
在子查询 final do中使用它SUM
。
查询 1:
SELECT SUM(AggTotal) AggTotal,GLAccount
FROM (
select amount_split1 as AggTotal,
account as GLAccount,
expheaderid -- <-- add this column
from Expenses
union all
select
amount_split2 as AggTotal,
account2 as GLAccount ,
expheaderid
from Expenses
) t1
where expheaderid = 57
GROUP BY GLAccount
结果:
| AggTotal | GLAccount |
|----------|-----------|
| 0 | 0 |
| 5.9 | 70410 |
| 261.36 | 80400 |
| 30 | 80401 |
| 105 | 80402 |
| 277.96 | 80440 |
| 67.35 | 80870 |
推荐阅读
- javascript - 提交表单时React useState钩子不起作用
- swiftui - SwiftUI (5.3) “苹果登录”
- html - 如何在 Chakra UI 元素中添加 ::-webkit-scrollbar 伪元素?(反应)
- d3.js - 鼠标指针与十字准线指针不同步。在 D3 v6 中
- asp.net - 如何使用 IdentityRoleClaim 表 (IdentityRoleClaim
Class) 在 ASP.Net Core 中的 Identity - go - 是否有工具可以检测到导致运行时崩溃的 nil 接口的这种使用?
- matlab - 为什么 Matlab2tikz 不能用分类数据显示数字?
- security - 如何保护我的 API 免受“虚构”有效负载的影响?
- r - R CARET:错误 3 参数传递给需要 1 的“is.nan”
- reactjs - react-hook-form:表单状态和输入状态之间双向映射的惯用方法