SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM  CHANNELRESULT WHERE CHANNELNAME ='江苏卫视' and createtime  between  
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss')  UNION ALL 
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='优漫卡通卫视' and  createtime between  
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss')  UNION ALL 
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='北京卫视' and createtime  between  
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='东方卫视' and createtime between 
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='天津卫视' and createtime between 
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='重庆卫视' and createtime between  
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='安徽卫视' and createtime between 
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='浙江卫视' and createtime between
to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='广西卫视' and createtime between
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL (SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='湖南卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='湖北卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='辽宁卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='东南卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='山东卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='江西卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='旅游卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='四川卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='黑龙江卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='贵州卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='河北卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='云南卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='广东卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='吉林卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='河南卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='西藏卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='甘肃卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='新疆卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='青海卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='宁夏卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='山西卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') UNION ALL 
 SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) FROM CHANNELRESULT WHERE CHANNELNAME ='兵团卫视' and createtime between  
 to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') 像这样的SQL语句能不能优化,优化SQL语句主要考虑哪些东西 请大神指教

解决方案 »

  1.   

    这个不用UNION ALL 直接用CASE WHEN,不行嘛?
      

  2.   

    直接做个分组就得了罢。SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) 
    FROM CHANNELRESULT WHERE createtime between  
    to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') 
    and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') 
    GROUP BY(频道字段);
    不知道为什么写得这么麻烦。
      

  3.   

    SELECT CHANNELNAME,SUM(NVL(TIMELENGTH,0)),COUNT(XLH),COUNT(DISTINCT XLH) 
      FROM  CHANNELRESULT 
      WHERE createtime >= to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss')
        AND createtime <= to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss')
      GROUP BY CHANNELNAME
      

  4.   


    -- 通过子查询先将所有的频道列表虚拟成一个视图,然后再和原表进行join查询。
    SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) 
    FROM CHANNELRESULT A,
         (SELECT '江苏卫视' CHANNELRESULTNAME FROM DUAL UNION ALL
          SELECT '优漫卡通卫视' FROM DUAL UNION ALL
          ......
          SELECT '兵团卫视' FROM DUAL) B, 
    WHERE A.CHANNELNAME = B.CHANNELNAME  
      and A.createtime between to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') 
      

  5.   

    应当比完全由union组成的语句的效率要高。
      

  6.   

    效率高不高,你一试便知!
    我想这样直连肯定比你用union all快多了!
      

  7.   

    SELECT NVL(SUM(TIMELENGTH),0),COUNT(XLH),COUNT(DISTINCT XLH) 
    FROM CHANNELRESULT WHERE createtime between  
    to_date('2011-8-01 00:00:00','yyyy-MM-dd hh24:MI:ss') 
    and to_date('2011-8-31 23:59:59','yyyy-MM-dd hh24:MI:ss') 
    GROUP BY(频道字段);用上面不久得了。搞那么复杂吓唬人么。