按条件的sum()

[复制链接]
查看11 | 回复5 | 2010-3-1 11:20:51 | 显示全部楼层 |阅读模式
需求:


QQ截图20160509164557.png (48.92 KB, 下载次数: 6)
下载附件
2016-5-9 16:47 上传

with t as (
select 1 as value_col,'a' as name_col,'一' as group_col from dual
union all
select 2 as value_col,'b' as name_col,'一' as group_colfrom dual
union all
select 3 as value_col,'c' as name_col,'一' as group_colfrom dual
union all
select 0 as value_col,'d' as name_col,'一' as group_colfrom dual
union all
select 5 as value_col,'a' as name_col,'二' as group_col from dual
union all
select 6 as value_col,'b' as name_col,'二' as group_colfrom dual
union all
select 7 as value_col,'c' as name_col,'二' as group_colfrom dual
union all
select 9 as value_col,'d' as name_col,'二' as group_colfrom dual
)
select sum(value_col),group_col from t group by group_col复制代码

回复

使用道具 举报

千问 | 2010-3-1 11:20:51 | 显示全部楼层
-- 使用一个 decode + min + abs + sign 判定一下
select sum(value_col) * decode(min(abs(sign(value_col))),0,1,0) ,group_col from t group by group_col
回复

使用道具 举报

千问 | 2010-3-1 11:20:51 | 显示全部楼层

如下:
SQL> with t as (
2select 1 as value_col,'a' as name_col,'一' as group_col from dual
3union all
4select 2 as value_col,'b' as name_col,'一' as group_colfrom dual
5union all
6select 3 as value_col,'c' as name_col,'一' as group_colfrom dual
7union all
8select 0 as value_col,'d' as name_col,'一' as group_colfrom dual
9union all
10select 5 as value_col,'a' as name_col,'二' as group_col from dual
11union all
12select 6 as value_col,'b' as name_col,'二' as group_colfrom dual
13union all
14select 7 as value_col,'c' as name_col,'二' as group_colfrom dual
15union all
16select 9 as value_col,'d' as name_col,'二' as group_colfrom dual
17)
18select case when sum(case when name_col = 'd' and value_col = 0 then 1 else 0 end)0 then sum(value_col) else 0 end sum_value_col,
19 group_col
20from t
21group by group_col
22/
SUM_VALUE_COL GROUP_COL
------------- ---------

0 二

6 一
SQL>

回复

使用道具 举报

千问 | 2010-3-1 11:20:51 | 显示全部楼层
with t1 as (
select 1 as value_col,'a' as name_col,'一' as group_col from dual
union all
select 2 as value_col,'b' as name_col,'一' as group_colfrom dual
union all
select 3 as value_col,'c' as name_col,'一' as group_colfrom dual
union all
select 0 as value_col,'d' as name_col,'一' as group_colfrom dual
union all
select 5 as value_col,'a' as name_col,'二' as group_col from dual
union all
select 6 as value_col,'b' as name_col,'二' as group_colfrom dual
union all
select 7 as value_col,'c' as name_col,'二' as group_colfrom dual
union all
select 9 as value_col,'d' as name_col,'二' as group_colfrom dual
)
--select sum(value_col) * decode(min(abs(sign(value_col))),0,1,0) ,group_col from t1 group by group_col
,
t2 as (
select value_col,name_col,group_col from t1 where value_col0 and name_col = 'd'
),
t3 as (
select
(case when t2.value_col0 then 0 else t1.value_col end) as value_col,
t1.name_col,
t1.group_col
from t1 left join t2 on t1.group_col = t2.group_col
)
select sum(t3.value_col),t3.group_col from t3 group by t3.group_col复制代码
回复

使用道具 举报

千问 | 2010-3-1 11:20:51 | 显示全部楼层
我另一种方法
SELECT
group_col,
sum(case when a > 0 then 0 else value_col end)
FROM
(select t.*,
sum(case when name_col='d' then value_col end) over (partition by group_col)a
from t )t1
group by group_col

回复

使用道具 举报

千问 | 2010-3-1 11:20:51 | 显示全部楼层
2#楼的 取最小值 ,可能除了d之外其他值包括0,就会有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行