一张表a中有字段:客户、收入、支出
如何一条sql实现以下三列统计结果
---------------------------------------------------
客户数 收入合计 支出合计
收入大于支出
收入等于支出
收入小于支出
由于改表数据很大,希望能用一条sql全表搜索实现下面语句,而不是搜索3次。
select count(1),sum(收入),sum(支出) from a where 收入>支出
union all
select count(1),sum(收入),sum(支出) from a where 收入=支出
union all
select count(1),sum(收入),sum(支出) from a where 收入<支出
如何一条sql实现以下三列统计结果
---------------------------------------------------
客户数 收入合计 支出合计
收入大于支出
收入等于支出
收入小于支出
由于改表数据很大,希望能用一条sql全表搜索实现下面语句,而不是搜索3次。
select count(1),sum(收入),sum(支出) from a where 收入>支出
union all
select count(1),sum(收入),sum(支出) from a where 收入=支出
union all
select count(1),sum(收入),sum(支出) from a where 收入<支出
解决方案 »
- 【求助】jdbc连接oracle时出错!!!
- oracle数据还原问题,希望高手给与答案
- oracle海量数据如何导出成多个文本文件?
- 关于ORACLE与EXCEL的接口问题
- 各位大侠!!!!!! 谁有TOAD for DB2 的注册码?
- 问题追加30分
- oracle 到 informix,高手们快看啊,高分求救。。。
- 请问一下,RedHat 8.0下怎么安装oracle8.1.7?
- 请教 “ORA-00020:maximum number of process(50) exceeded” ??
- 怎么在PLSQL表中添加时间戳
- 动态创建表和索引
- 求解:[org.hibernate.util.JDBCExceptionReporter] ORA-00904: "SHOWTIPS": 标识符无效
select count(1),sum(收入),sum(支出) from a
group by sign(收入-支出)--例如:
select count(*),sum(sal),sum(nvl(comm,0))
from emp
group by sign(sal-nvl(comm,0))
COUNT(*) SUM(SAL) SUM(NVL(COMM,0))
---------- ---------- ----------------
12 26975 4400
2 2050 2300
select count(1),sum(case when 收入>支出 then 收入 else 0) 收入1,
sum(case when 收入>支出 then 收入 else 0) 支出1,
sum(case when 收入=支出 then 收入 else 0) 收入2,
sum(case when 收入=支出 then 收入 else 0) 支出2,
sum(case when 收入<支出 then 收入 else 0) 收入3,
sum(case when 收入<支出 then 收入 else 0) 支出3
from a
,SUM(收入) 收入合计
,SUM(支出) 支出合计
,CASE
WHEN 收入 > 支出 THEN
'收入大于支出'
WHEN 收入 = 支出 THEN
'收入等于支出'
WHEN 收入 < 支出 THEN
'收入小于支出'
END 收支情况
FROM (
SELECT 'A' 客户,100 收入,200 支出 FROM DUAL UNION ALL
SELECT 'B' 客户,200 收入,200 支出 FROM DUAL UNION ALL
SELECT 'C' 客户,300 收入,100 支出 FROM DUAL UNION ALL
SELECT 'D' 客户,400 收入,300 支出 FROM DUAL UNION ALL
SELECT 'E' 客户,500 收入,200 支出 FROM DUAL UNION ALL
SELECT 'F' 客户,600 收入,600 支出 FROM DUAL UNION ALL
SELECT 'G' 客户,700 收入,200 支出 FROM DUAL UNION ALL
SELECT 'H' 客户,800 收入,950 支出 FROM DUAL UNION ALL
SELECT 'I' 客户,900 收入,950 支出 FROM DUAL UNION ALL
SELECT 'J' 客户,900 收入,200 支出 FROM DUAL
)
GROUP BY CASE
WHEN 收入 > 支出 THEN
'收入大于支出'
WHEN 收入 = 支出 THEN
'收入等于支出'
WHEN 收入 < 支出 THEN
'收入小于支出'
END试试这个/
from a
group by decode(sign(收入-支出),1,'进账',0,'平衡',-1,'出账')
select count(1), sum(shouru), sum(zhichu) from (
with tab as(
select 'a' kehu, 100 shouru, 1000 zhichu from dual union all
select 'b' kehu, 200 shouru, 2000 zhichu from dual union all
select 'c' kehu, 300 shouru, 300 zhichu from dual union all
select 'd' kehu, 400 shouru, 400 zhichu from dual union all
select 'e' kehu, 5000 shouru, 500 zhichu from dual union all
select 'f' kehu, 6000 shouru, 600 zhichu from dual
)
select kehu, shouru,zhichu, (case when shouru > zhichu then 1 when shouru < zhichu then 0 else -1 end) flg
from tab
)group by flg------------------------------------
count(1) sum(shouru) sum(zhichu)
2 11000 1100
2 700 700
2 300 3000