CREATE OR REPLACE VIEW V_BUYORDER AS
SELECT distinct stock_code,
    max(CASE rn WHEN 1 THEN nlimitprice ELSE null END) AS buy_price1,
    max(CASE rn WHEN 1 THEN nvolume ELSE null END) AS buy_quan1,
    max(CASE rn WHEN 2 THEN nlimitprice ELSE null END) AS buy_price2,
    max(CASE rn WHEN 2 THEN nvolume ELSE null END) AS buy_quan2,
    max(CASE rn WHEN 3 THEN nlimitprice ELSE null END) AS buy_price3,
    max(CASE rn WHEN 3 THEN nvolume ELSE null END) AS buy_quan3
FROM (SELECT distinct stock_code, 
                nlimitprice,      
                nvolume,          
                ROW_NUMBER() OVER(PARTITION BY stock_code ORDER BY stock_code) RN
  FROM (select stock_code, nlimitprice, nvolume
          from (select t2.stock_code,           --产品代码
                       t1.nlimitprice,             --价格
                       sum(t1.nvolume) nvolume     --数量
                  from tbfutrsopenorder t1, futures_new t2
                 where to_char(t1.dplacedat, 'yyyy-MM-dd') =
                       to_char(sysdate, 'yyyy-MM-dd')
                   and t1.nproductid = t2.id
                   and t1.ntradeaction = 0
                   and (t1.norderstatus = 0 or t1.norderstatus = 2)
                   group by t2.stock_code,t1.nlimitprice
                 order by t2.stock_code  asc,
                          t1.nlimitprice desc)
         order by stock_code,nlimitprice desc)
 order by stock_code, nlimitprice desc)
 GROUP BY stock_code
想提高查询速度

解决方案 »

  1.   


    SELECT stock_code,
        max( DECODE(RN,1,nlimitprice ,NULL)) AS buy_price1, 
        max(DECODE(RN,1,nvolume ,NULL)) AS buy_quan1, 
        max(DECODE(RN,2,nlimitprice ,NULL) ) AS buy_price2, 
        max(DECODE(RN,2,nvolume ,NULL) ) AS buy_quan2, 
        max(DECODE(RN,3,nlimitprice ,NULL)) AS buy_price3, 
        max(DECODE(RN,3,nvolume ,NULL) ) AS buy_quan3 
    FROM (SELECT DISTINCT stock_code, 
                    nlimitprice,      
                    nvolume,          
                    ROW_NUMBER() OVER(PARTITION BY stock_code ORDER BY stock_code) RN 
      FROM (select stock_code, nlimitprice, nvolume 
              from (select t2.stock_code,          --产品代码 
                          t1.nlimitprice,            --价格 
                          sum(t1.nvolume) nvolume    --数量 
                      from tbfutrsopenorder t1, futures_new t2 
                    where to_char(t1.dplacedat, 'yyyy-MM-dd') = 
                          to_char(sysdate, 'yyyy-MM-dd') 
                      and t1.nproductid = t2.id 
                      and t1.norderstatus in(1,2)
                      and t1.ntradeaction = 0 
                      group by t2.stock_code,t1.nlimitprice 
                 ) 
           ) 

    GROUP BY stock_code PS:因为对具体情况不了解,只能大概给你修改一下了
      

  2.   

    -- TRY IT ..
    SELECT STOCK_CODE,
           MAX(CASE RN WHEN 1 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE1, 
           MAX(CASE RN WHEN 1 THEN NVOLUME ELSE NULL END) AS BUY_QUAN1, 
           MAX(CASE RN WHEN 2 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE2, 
           MAX(CASE RN WHEN 2 THEN NVOLUME ELSE NULL END) AS BUY_QUAN2, 
           MAX(CASE RN WHEN 3 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE3, 
           MAX(CASE RN WHEN 3 THEN NVOLUME ELSE NULL END) AS BUY_QUAN3
      FROM (SELECT T2.STOCK_CODE,
                   T1.NLIMITPRICE,
                   SUM(T1.NVOLUME) NVOLUME,
                   ROW_NUMBER() OVER(PARTITION BY T2.STOCK_CODE ORDER BY T2.STOCK_CODE, T1.NLIMITPRICE DESC) RN
              FROM TBFUTRSOPENORDER T1, FUTURES_NEW T2
             WHERE T1.NPRODUCTID = T2.ID
               AND T1.NTRADEACTION = 0
               AND (T1.NORDERSTATUS = 0 OR T1.NORDERSTATUS = 2)
               AND TO_CHAR(T1.DPLACEDAT, 'YYYY-MM-DD') =
                   TO_CHAR(SYSDATE, 'YYYY-MM-DD')
             GROUP BY T2.STOCK_CODE, T1.NLIMITPRICE) TT
     GROUP BY STOCK_CODE;
      

  3.   

    -- 不好意思,很久不用脑子不好使了, Skip above SQL:
    SELECT STOCK_CODE,
           MAX(CASE RN WHEN 1 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE1, 
           MAX(CASE RN WHEN 1 THEN NVOLUME ELSE NULL END) AS BUY_QUAN1, 
           MAX(CASE RN WHEN 2 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE2, 
           MAX(CASE RN WHEN 2 THEN NVOLUME ELSE NULL END) AS BUY_QUAN2, 
           MAX(CASE RN WHEN 3 THEN NLIMITPRICE ELSE NULL END) AS BUY_PRICE3, 
           MAX(CASE RN WHEN 3 THEN NVOLUME ELSE NULL END) AS BUY_QUAN3
      FROM (SELECT STOCK_CODE,
                   NLIMITPRICE,
                   NVOLUME,
                   ROW_NUMBER() OVER(PARTITION BY STOCK_CODE ORDER BY STOCK_CODE, NLIMITPRICE DESC) RN
              FROM (SELECT T2.STOCK_CODE, T1.NLIMITPRICE, SUM(T1.NVOLUME) NVOLUME
                      FROM TBFUTRSOPENORDER T1, FUTURES_NEW T2
                     WHERE T1.NPRODUCTID = T2.ID
                       AND T1.NTRADEACTION = 0
                       AND (T1.NORDERSTATUS = 0 OR T1.NORDERSTATUS = 2)
                       AND TO_CHAR(T1.DPLACEDAT, 'YYYY-MM-DD') =
                           TO_CHAR(SYSDATE, 'YYYY-MM-DD')
                     GROUP BY T2.STOCK_CODE, T1.NLIMITPRICE) ZZ) TT
     GROUP BY STOCK_CODE;