只考虑sql简单高效,暂时不考虑索引等优化。表Table1有80多列,其中有200多万数据,我现在想从中选出n列做统计。分组字段:A,B,C
统计字段:D,E,F,G
求和字段:MIANJI现在我的SQL语句如下:SELECT A,B,C,
(SELECT SUM(MIANJI) FROM Table1 T2 WHERE D='111' AND T2.A=T1.A AND T2.B=T1.B AND T2.C=T1.C),
(SELECT SUM(MIANJI) FROM Table1 T3 WHERE E='112' AND T3.A=T1.A AND T3.B=T1.B AND T3.C=T1.C),
(SELECT SUM(MIANJI) FROM Table1 T4 WHERE F='113' AND T4.A=T1.A AND T4.B=T1.B AND T4.C=T1.C),
(SELECT SUM(MIANJI) FROM Table1 T2 WHERE G='114' AND T5.A=T1.A AND T5.B=T1.B AND T5.C=T1.C),FROM Table1 T1 WHERE A IN('1','2','3') GROUP BY A,B,C ORDER BY A,B,C出来的结果呢也是我需要的,本来Table1的数据量就大,而我现在还用了那么多的"SELECT *** FROM Table1",是否影响效率啊?请问大家有没有更好的SQL语句?多多指教!

解决方案 »

  1.   

    SELECT   A,B,C, 
    sum(decode(d,'111',mianji,0)),
    sum(decode(e,'112',mianji,0)),
    sum(decode(f,'113',mianji,0)),
    sum(decode(g,'114',mianji,0)),
    FROM   Table1   T1   
    WHERE   A   IN( '1 ', '2 ', '3 ')   
    GROUP   BY   A,B,C   
    ORDER   BY   A,B,C 
    这样行不
      

  2.   

    谢谢wdswcy!你的方法挺好。又学好到,以前没想到这么做也可以。
      

  3.   

    如果是dss系统,可以考虑使用创建一个物化视图,这样你的性能会有极大的提升.当然前提是必须刷新数据的.
      

  4.   

    TO:wdswcy
    decode(d,'111',mianji,0)中的条件如果碰到下边这种情况呢:
    原来是D='111',现在变为D='111' and D='112',或者他的条件是
    D='111' and (D='112' or F='23')???
      

  5.   


    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)该函数的含义如下:
    if ( 条件=值1 )
        return(翻译值1)
    else if( 条件=值2)
        return(翻译值2)
        ......
    else if( 条件=值n )
        return(翻译值n)else
        return(缺省值)
    end if;select decode('2',null,'1',2,(select 5 from dual),'4') from dual ;返回5select decode(null,null,'1',2,(select 5 from dual),'4') from dual ;返回 1注意: 这里的翻译值和缺省值可以使用表达式或子查询,但是不能返回多个值,否则会出现错误.你可以这样写decode(d,'111',mianji,'112',mianji,0)
      

  6.   

    再不行就用case  sum(case   when   条件   
             then   mianji
             else   0
         end)