SQL Server(2008)与汇总的联合
我有一个费用报告应用程序,它将费用和账号收集到一个表中,但给定的费用可以拆分为一部分计入一个总账账户,其余部分计入另一个账户。为了适应成本拆分,费用表有两对金额和账号列,供数据输入过程使用。像这样:SQL Server(2008)与汇总的联合,sql,sql-server,group-by,union-all,Sql,Sql Server,Group By,Union All,我有一个费用报告应用程序,它将费用和账号收集到一个表中,但给定的费用可以拆分为一部分计入一个总账账户,其余部分计入另一个账户。为了适应成本拆分,费用表有两对金额和账号列,供数据输入过程使用。像这样: create table Expenses (expheaderid int, explineid int, amount_split1 decimal(5,2), account int, amount_split2 decimal(5,2), account2 int); insert Exp
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);
我需要汇总(分组)来自相同账户代码的金额,但汇总必须发生在两对金额和账户编号列之间(金额拆分1和账户)第一对或(金额拆分2和账户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
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;
我想将金额_split1成本与金额_split2成本合并,按账号分组
结果应如下所示,从“科目”列和“科目2”列中的总账科目中收集
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.
我根本不擅长复合查询。我试图用这样一句话来表示联合和分组:
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
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子句必须起作用
谢谢你的帮助。你有试过部分地做吗。 试试这种CTE
WITH C AS(
(select amount_split1 as AggTotal, account as GLAccount,expheaderid from Expenses)
union all
(select amount_split2 as AggTotal, account2 as GLAccount,expheaderid from Expenses)
)SELECT sum(AggTotal) AS SUMAVGTOTAL, GLAccount
FROM C
WHERE expheaderid=57
GROUP BY GLAccount
select sum(AggTotal), GLAccount from
((select amount_split1 as AggTotal, account as GLAccount from Expenses where expheaderid=57)
union all
(select amount_split2 as AggTotal, account2 as GLAccount from Expenses where expheaderid=57))as t
group by GLAccount;
还是这个
WITH C AS(
(select amount_split1 as AggTotal, account as GLAccount,expheaderid from Expenses)
union all
(select amount_split2 as AggTotal, account2 as GLAccount,expheaderid from Expenses)
)SELECT sum(AggTotal) AS SUMAVGTOTAL, GLAccount
FROM C
WHERE expheaderid=57
GROUP BY GLAccount
select sum(AggTotal), GLAccount from
((select amount_split1 as AggTotal, account as GLAccount from Expenses where expheaderid=57)
union all
(select amount_split2 as AggTotal, account2 as GLAccount from Expenses where expheaderid=57))as t
group by GLAccount;
将expheaderid=57添加到联合体的每个部分
同样,你也可以用一个诱人的方法来做同样的事情。
如果它不起作用,请告诉我您可以尝试在子查询中
合并所有
,然后添加expheaderid
列,因为您需要在子查询final doSUM
中的位置使用它
查询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 |
至于为什么它不会绑定:您的from子句由1个表t
组成,因此当where子句执行时,它不知道Expenses
表。另外,表t
没有expheaderid
列;因此,即使我们做了t.expheaderid
,也不会找到它。那么,您希望SQL引擎在哪里找到费用。expheaderid
?可以将其包含在带有联合的选择中,也可以在选择中单独按其过滤。