一张表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 收入<支出

解决方案 »

  1.   

    --你这个不就是个排序功能吗?
    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
      

  2.   


    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
      

  3.   

    SELECT COUNT(客户) 客户
          ,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试试这个/
      

  4.   

    select decode(sign(收入-支出),1,'进账',0,'平衡',-1,'出账') flag,count(1),sum(收入),sum(支出)
    from a
    group by decode(sign(收入-支出),1,'进账',0,'平衡',-1,'出账')
      

  5.   


    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