SQL Server (2008) UNION 与 ROLL UP

Posted

技术标签:

【中文标题】SQL Server (2008) UNION 与 ROLL UP【英文标题】:SQL Server (2008) UNION with ROLL UP 【发布时间】:2018-10-04 18:59:35 【问题描述】:

我有一个费用报告应用程序,可将费用费用和帐号收集到一个表格中,但可以将给定费用拆分为一部分记入一个 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 子句必须起作用。

感谢您的帮助。

【问题讨论】:

至于为什么它不会绑定:你的 from 子句由 1 个表 t 组成,所以当 where 子句执行时,它不知道 Expenses 表。另外表t 没有expheaderid 列;所以即使我们做了t.expheaderid 它也不会被发现。那么您希望 SQL 引擎在哪里找到Expenses.expheaderid?要么将它包含在带有联合的选择中,要么在选择中单独过滤。 【参考方案1】:

您可以尝试在子查询中使用UNION ALL,然后添加expheaderid 列,因为您需要在子查询中的where 上使用它最后做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

Results

| AggTotal | GLAccount |
|----------|-----------|
|        0 |         0 |
|      5.9 |     70410 |
|   261.36 |     80400 |
|       30 |     80401 |
|      105 |     80402 |
|   277.96 |     80440 |
|    67.35 |     80870 |

【讨论】:

【参考方案2】:

您是否尝试过分部分进行。 试试这样的 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;

将您的 expheaderid=57 添加到 union 的每个部分中

你也可以使用一个临时的 ## 来做同样的事情。 如果它不起作用,请告诉我

【讨论】:

以上是关于SQL Server (2008) UNION 与 ROLL UP的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server函数?

sql server 查询 order by 与 union 并替换多个列的空值

获取“多步操作产生错误。检查每个状态值。”在 SQL Server 2008 中使用 ADO 时出错

SQL Server:如何将 UNION 与两个都有 WHERE 子句的查询一起使用?

与 UNION 一起使用时,对每个 SQL Server 查询都不起作用的排序

sql server 中union的用法