包括具有分组子句的求和行

时间:2013-02-11 22:54:53

标签: sybase-ase

查询:

SELECT aType, SUM(Earnings - Expenses) "Rev"
FROM aTable
GROUP BY aType
ORDER BY aType ASC

结果:

| aType | Rev   |
| ----- | ----- |
| A     | 20    |
| B     | 150   |
| C     | 250   |

问题: 是否可以在我的初始查询中使用Sybase语法在底部显示摘要行(如下所示),或者它是否必须是一个单独的查询?

| aType | Rev   |
| ----- | ----- |
| A     | 20    |
| B     | 150   |
| C     | 250   |
=================
| All   | 320   |

我无法从SQL中获取ROLLUP函数以成功转换为Sybase,但我不确定是否还有其他方法可以执行此操作(如果有的话)。

谢谢!

3 个答案:

答案 0 :(得分:1)

并非所有版本的Sybase都支持ROLLUP。你可以用老式的方式做到这一点:

with t as 
    (SELECT aType, SUM(Earnings - Expenses) "Rev"
     FROM aTable
     GROUP BY aType
    )
select t.*
from ((select aType, rev from t) union all
      (select NULL, sum(rev))
     ) t
ORDER BY (case when atype is NULL then 1 else 0 end), aType ASC

这是令人讨厌,蛮力的方法。如果此版本的Sybase不支持with,您可以执行以下操作:

select t.aType, t.Rev
from ((SELECT aType, SUM(Earnings - Expenses) "Rev"
       FROM aTable
       GROUP BY aType
      ) union all
      (select NULL, sum(rev))
     ) t
ORDER BY (case when atype is NULL then 1 else 0 end), aType ASC

这是非常基本的标准SQL。

答案 1 :(得分:1)

可能你可以使用sybase中的compute by子句来解决这个问题:

create table #tmp1( name char(9), earning int , expense int) 
insert into #tmp1 values("A",30,20)
insert into #tmp1 values("B",50,30)
insert into #tmp1 values("C",60,30)

select name, (earning-expense) resv from #tmp1
group by name
order by name,resv
compute sum(earning-expense)

OR

select name, convert(varchar(15),(earning-expense)) resv  from #tmp1
group by name
union all
SELECT "------------------","-----"
union all
select "ALL",convert(varchar(15),sum(earning-expense)) from #tmp1

谢谢, 戈帕尔

答案 2 :(得分:1)

您是否尝试使用与此类似的UNION ALL

select aType, Rev
from
(
  SELECT aType, SUM(Earnings - Expenses) "Rev", 0 SortOrder
  FROM aTable
  GROUP BY aType
  UNION ALL
  SELECT 'All', SUM(Earnings - Expenses) "Rev", 1 SortOrder
  FROM aTable
) src
ORDER BY SortOrder, aType

SQL Fiddle with Demo。这给出了结果:

| ATYPE | REV |
---------------
|     A |  10 |
|     B | 150 |
|     C | 250 |
|   All | 410 |