已知一表三个字段分别是名字、价格、类别,创建如下:
create table test(
name varchar2(100),price number,type varchar2(100)
);
插入数据:
insert into test values ('土',1000,'进');
insert into test values ('沙',500,'进');
insert into test values ('泥',300,'进');
insert into test values ('泥',100,'出');
insert into test values ('石',200,'出');
commit;
现在我的目的是查询到进的price为正数,出的为负数,我整理的思路和sql如下:
先把'出'的数据乘以-2插入到表中insert into test (select name,price*(-2),'临时' from test where type='出');
commit;
然后直接sum(price)就可以查询出正确结果select name,sum(price) from test group by name;
最后再删除临时数据delete from test where type='3';commit;
好吧没有报表经验,如何只用select来处理呢?sql报表

解决方案 »

  1.   

    最后再删除临时数据delete from test where type='临时';commit;粗心了
      

  2.   


    DECODE 或者  CASE WHEN
      

  3.   

    SELECT NAME,SUM(DECODE(TYPE,'进',PRICE,'出',(-1)*PRICE,0)) AS PRICE FROM TEST GROUP BY NAME;
      

  4.   

    SELECT NAME,SUM(DECODE(TYPE,'进',PRICE,'出',(-1)*PRICE,0)) AS PRICE FROM TEST GROUP BY NAME;
    你好,谢谢你的及时帮助,我刚测试了下,你这样做的结果是进的都是0,出的是负数,结果如下:
    土 0   沙 0   泥 -100   石 -200
    实际应该是:
    土 1000   沙 500   泥 200   石 -200
    就是说把进的都搞成0了。是不是逻辑哪里错了?没用过decode,请指教。
      

  5.   

    SELECT NAME,SUM(DECODE(TYPE,'进',PRICE,'出',(-1)*PRICE,0)) AS PRICE FROM TEST GROUP BY NAME;
    你好,谢谢你的及时帮助,我刚测试了下,你这样做的结果是进的都是0,出的是负数,结果如下:
    土 0   沙 0   泥 -100   石 -200
    实际应该是:
    土 1000   沙 500   泥 200   石 -200
    就是说把进的都搞成0了。是不是逻辑哪里错了?没用过decode,请指教。
    SELECT NAME, SUM(DECODE(TRIM(TYPE), '进', PRICE, '出', (-1) * PRICE, 0)) AS PRICE
      FROM TEST
     GROUP BY NAME;
      

  6.   

    SELECT NAME,SUM(DECODE(TYPE,'进',PRICE,'出',(-1)*PRICE,0)) AS PRICE FROM TEST GROUP BY NAME;
    我又错了,汗,刚才说的错了。谢谢您啊。结贴了!!感激不尽!!!!
      

  7.   

    SELECT NAME,SUM(DECODE(TYPE,'进',PRICE,'出',(-1)*PRICE,0)) AS PRICE FROM TEST GROUP BY NAME;
    你好,谢谢你的及时帮助,我刚测试了下,你这样做的结果是进的都是0,出的是负数,结果如下:
    土 0   沙 0   泥 -100   石 -200
    实际应该是:
    土 1000   沙 500   泥 200   石 -200
    就是说把进的都搞成0了。是不是逻辑哪里错了?没用过decode,请指教。
    SELECT NAME, SUM(DECODE(TRIM(TYPE), '进', PRICE, '出', (-1) * PRICE, 0)) AS PRICE
      FROM TEST
     GROUP BY NAME;
    这种做法也是对的!!学习了,我去搜下trim学习下。。
      

  8.   

    trim是过滤空格,汗,都还给老师了,很近没用sql,汗哒哒
      

  9.   

    SELECT NAME, DECODE(TRIM(TYPE), '进', PRICE, '出', (-1) * PRICE, 0) AS PRICE
      FROM TEST
    结果:
    土 1000
    沙 500
    泥 300
    泥 -100
    石 -200然后在上面的结果集上进行聚合统计:
    SELECT NAME, SUM(DECODE(TRIM(TYPE), '进', PRICE, '出', (-1) * PRICE, 0)) AS PRICE
      FROM TEST
     GROUP BY NAME;土 1000
    沙 500
    石 -200
    泥 200其中,关于DECODE函数:
    DECODE(TYPE, '进', PRICE, '出', (-1) * PRICE, 0)如果当前行中的数据,TYPE为'进'的时候,该列为PRICE如果为'出',该列为-1*PRICE,不为出或进,则为0你上面的显示-100,-200是因为你的'进'没有匹配上,估计可能是带有空格了.
      

  10.   

    报表的路,还很长,sql的学习还没起步
      

  11.   

    思路如此清晰,我百度也了解了DECODE,可以多个参数多个罗列匹配,第一个是字段名,最后一个就是默认值。
      

  12.   

    decode就是等于在表中生成虚拟的一列,可以根据这列某个字段动态更改这个字段的字,有这个函数太强大了!