------------------合计、小计的用法-----------------

create table #t(a int,b int,c int,d int,e int)
insert into #t values(1,2,3,4,5)
insert into #t values(1,2,3,4,6)
insert into #t values(1,2,3,4,7)
insert into #t values(1,2,3,4,8)
insert into #t values(1,3,3,4,5)
insert into #t values(1,3,3,4,6)
insert into #t values(1,3,3,4,8)
insert into #t values(1,3,3,4,7)

insert into #t values(2,2,2,4,5)
insert into #t values(2,2,3,4,6)
insert into #t values(2,2,4,4,7)
insert into #t values(2,2,5,4,8)
insert into #t values(2,3,6,4,5)
insert into #t values(2,3,3,4,6)
insert into #t values(2,3,3,4,8)
insert into #t values(2,3,3,4,7)

select
  case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b, sum(c) as c,sum(d) as d,sum(e) as e
from
  #t
group by
  a,b
with rollup
  having grouping(b)=0 or grouping(a)=1

/*a                              b           c           d           e          
------------------------------ ----------- ----------- ----------- -----------
1                              2           12          16          26
1                              3           12          16          26
2                              2           14          16          26
2                              3           15          16          26
合计                             NULL        53          64          104

(所影响的行数为 5 行)

select
  case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b, c, sum(d) as d,sum(e) as e
from
  #t
group by
  a,b,c
with rollup
  having grouping(c)=0 or grouping(a)=1
a                              b           c           d           e          
------------------------------ ----------- ----------- ----------- -----------
1                              2           3           16          26
1                              3           3           16          26
2                              2           2           4           5
2                              2           3           4           6
2                              2           4           4           7
2                              2           5           4           8
2                              3           3           12          21
2                              3           6           4           5
合计                             NULL        NULL        64          104

(所影响的行数为 9 行)


select
  case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b,
  case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end c,
  sum(d) as d,sum(e) as e
from
  #t
group by
  a,b,c
with rollup
  having grouping(a)=1 or grouping(b)=0

a                              b           c                              d           e          
------------------------------ ----------- ------------------------------ ----------- -----------
1                              2           3                              16          26
1                              2           小计                             16          26
1                              3           3                              16          26
1                              3           小计                             16          26
2                              2           2                              4           5
2                              2           3                              4           6
2                              2           4                              4           7
2                              2           5                              4           8
2                              2           小计                             16          26
2                              3           3                              12          21
2                              3           6                              4           5
2                              3           小计                             16          26
合计                             NULL        NULL                           64          104

(所影响的行数为 13 行)


select
   case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
   case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b, sum(c) as c, sum(d) as d,sum(e) as e from #t
group by
   a,b,c
with rollup
   having grouping(a)=1 or grouping(b)=1 or grouping(c)=0

drop table #t

a                              b                              c           d           e          
------------------------------ ------------------------------ ----------- ----------- -----------
1                              2                              12          16          26
1                              3                              12          16          26
1                              小计                             24          32          52
2                              2                              2           4           5
2                              2                              3           4           6
2                              2                              4           4           7
2                              2                              5           4           8
2                              3                              9           12          21
2                              3                              6           4           5
2                              小计                             29          32          52
合计                             NULL                           53          64          104

(所影响的行数为 11 行)

*/

 

回答: SQL窗口函数有一些高级用法。首先,窗口函数通常只能在SELECT子句中使用,并且窗口函数中的ORDER BY子句不会影响最终结果的排序,它只是用来确定窗口函数的计算顺序。其次,窗口函数可以使用GROUPING运算符来计算合计小计。其中,ROLLUP是一种常用的GROUPING运算符,用于计算合计小计。\[1\]\[2\] 窗口函数的语法如下: <窗口函数> OVER (ORDER BY <排序用列名> ROWS n PRECEDING) <窗口函数> OVER (ORDER BY <排序用列名> ROWS BETWEEN n PRECEDING AND n FOLLOWING) 这些语法可以用来指定窗口函数的排序方式和计算范围。例如,可以使用ROWS BETWEEN子句来指定窗口函数计算的范围,如"ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING"表示计算当前行及其前后一行的窗口函数值。\[2\]\[3\] 总之,SQL窗口函数的高级用法包括使用ORDER BY子句确定计算顺序,使用GROUPING运算符计算合计小计,以及使用ROWS BETWEEN子句指定计算范围。这些用法可以帮助我们更灵活地使用窗口函数进行数据分析和计算。 #### 引用[.reference_title] - *1* [SQL学习——窗口函数](https://blog.csdn.net/luschka/article/details/114333624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【SQL】(task5)SQL高级处理(窗口函数 | ROLLUP)](https://blog.csdn.net/qq_35812205/article/details/121425049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值