一张表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 收入<支出
解决方案 »
- 如何将一个字符串转化成一个表?
- 求工作量统计问题
- oracel超级菜鸟提问一个查询语句
- 问题:使用oradim创建实例后,无法在sqlplus中登录它
- 请问使用delete从一个表里删除记录后,能否恢复删除数据,怎么恢复?恢复成功再送100,谢谢!
- 这个脚本怎么有错呢?
- 在oracle中如何设置数据库的时区(DBTIMEZONE)?
- 如何用ORACLE导出数据库中单独的某张表的数据exp吗?
- Oracle8i和9i一个表最多支持多少字段??
- oracle Trigger 编译
- 动态创建表和索引
- 求解:[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