DROP TABLE ü PURGE;

CREATE TABLE ü(ü, üȣ, ڵ, Ǳ׷ڵ, ü, üݾ)
NOLOGGING
AS
SELECT '20090315'
     , ROWNUM 
     , DECODE(SIGN(ROWNUM-100000), 1, 'ST', 'KQ')        -- , ڽ 
     , DECODE(MOD(ROWNUM, 8), 0, 'SS', 1, 'EF', 2, 'EW'  -- ֽ, ETF, ELW
                            , 3, 'DR', 4, 'SW', 5, 'RT'  -- DR, μ, 
                            , 6, 'BC', 7, 'MF')          -- , ȸ
     , ROUND(DBMS_RANDOM.VALUE(10, 1000), -1) 
     , ROUND(DBMS_RANDOM.VALUE(10000, 1000000), -2) 
FROM   DUAL
CONNECT BY LEVEL <= 500000
UNION ALL
SELECT '20090315'
     , ROWNUM + 300000 
     ,(CASE WHEN MOD(ROWNUM, 4) < 2 THEN 'SD' ELSE 'GD' END)
     ,(CASE WHEN MOD(ROWNUM, 4) IN (0, 2) THEN 'FU' ELSE 'OP' END)
     , ROUND(DBMS_RANDOM.VALUE(10, 1000), -1) 
     , ROUND(DBMS_RANDOM.VALUE(10000, 1000000), -2) 
FROM   DUAL
CONNECT BY LEVEL <= 500000
;


CREATE OR REPLACE FUNCTION SF_ǰз(ڵ VARCHAR2, Ǳ׷ڵ VARCHAR2) 
RETURN VARCHAR2
IS
  L_з VARCHAR2(20);
BEGIN
  IF ڵ IN ('ST', 'KQ') THEN  -- , ڽ
    IF Ǳ׷ڵ = 'SS' THEN 
      L_з := 'ֽ ';
    ELSIF Ǳ׷ڵ IN ('EF', 'EW') THEN  -- ETF, ELW
      L_з := 'Ļ';
    ELSE 
      L_з := 'ֽĿ ';
    END IF;
  ELSE  
     L_з := 'Ļ';
  END IF;
  
  --SELECT  || '. ' || L_з INTO L_з 
  --FROM   з
  --WHERE  з = L_з;
  
  RETURN L_з;
END;
/


COLUMN ǰз FORMAT A15
COLUMN üǼ FORMAT 99999999
COLUMN ü FORMAT 9999999999
COLUMN üݾ FORMAT 9999999999999

SET TIMING ON


SELECT SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
     , COUNT(*) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM   ü
WHERE  ü = '20090315'
GROUP BY SF_ǰз(ڵ, Ǳ׷ڵ)
ORDER BY 1 ;


SELECT CASE
       WHEN ڵ IN ('ST', 'KQ') AND Ǳ׷ڵ  = 'SS' THEN 'ֽ '
       WHEN ڵ IN ('ST', 'KQ') AND Ǳ׷ڵ NOT IN ('SS', 'EF', 'EW') THEN 'ֽĿ '
       WHEN ڵ IN ('SD', 'GD') OR Ǳ׷ڵ IN ('EF', 'EW') THEN 'Ļ'
       END ǰз
     , COUNT(*) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM   ü
WHERE  ü = '20090315'
GROUP BY 
       CASE
       WHEN ڵ IN ('ST', 'KQ') AND Ǳ׷ڵ  = 'SS' THEN 'ֽ '
       WHEN ڵ IN ('ST', 'KQ') AND Ǳ׷ڵ NOT IN ('SS', 'EF', 'EW') THEN 'ֽĿ '
       WHEN ڵ IN ('SD', 'GD') OR Ǳ׷ڵ IN ('EF', 'EW') THEN 'Ļ'
       END
ORDER BY 1 ;


SELECT DECODE( ڵ||Ǳ׷ڵ
             , 'STSS', 'ֽ '
             , 'KQSS', 'ֽ '
             , 'SDFU', 'Ļ'
             , 'SDOP', 'Ļ'
             , 'GDFU', 'Ļ'
             , 'GDOP', 'Ļ'
             , 'STEF', 'Ļ'
             , 'STEW', 'Ļ'
             , 'KQEF', 'Ļ'
             , 'KQEW', 'Ļ'
             , 'ֽĿ ' ) ǰз
     , COUNT(*) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM   ü
WHERE  ü = '20090315'
GROUP BY 
       DECODE( ڵ||Ǳ׷ڵ
             , 'STSS', 'ֽ '
             , 'KQSS', 'ֽ '
             , 'SDFU', 'Ļ'
             , 'SDOP', 'Ļ'
             , 'GDFU', 'Ļ'
             , 'GDOP', 'Ļ'
             , 'STEF', 'Ļ'
             , 'STEW', 'Ļ'
             , 'KQEF', 'Ļ'
             , 'KQEW', 'Ļ'
             , 'ֽĿ ' )
ORDER BY 1 ;



                     
DROP TABLE з PURGE;

CREATE TABLE з(з, )
AS
SELECT 'ֽ ', 1 FROM DUAL
UNION ALL
SELECT 'ֽĿ ', 2 FROM DUAL
UNION ALL
SELECT 'Ļ', 3 FROM DUAL ;


-- SF_ǰз Լ ּ 
CREATE OR REPLACE FUNCTION SF_ǰз(ڵ IN VARCHAR2, Ǳ׷ڵ IN VARCHAR2) 
RETURN VARCHAR2
IS
  L_з VARCHAR2(14);
BEGIN
  IF ڵ IN ('ST', 'KQ') THEN
    IF Ǳ׷ڵ = 'SS' THEN 
      L_з := 'ֽ ';
    ELSIF Ǳ׷ڵ IN ('EF', 'EW') THEN 
      L_з := 'Ļ';
    ELSE 
      L_з := 'ֽĿ ';
    END IF;
  ELSE  
     L_з := 'Ļ';
  END IF;
  
  SELECT  || '. ' || L_з INTO L_з 
  FROM   з
  WHERE  з = L_з;
  
  RETURN L_з;
END;
/


SELECT SF_ǰз('ST','SS') FROM DUAL
UNION ALL
SELECT SF_ǰз('ST','SW') FROM DUAL
UNION ALL
SELECT SF_ǰз('ST','EF') FROM DUAL ;



SELECT SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
     , COUNT(*) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM   ü
WHERE  ü = '20090315'
GROUP BY SF_ǰз(ڵ, Ǳ׷ڵ)
ORDER BY 1 ;




SELECT DECODE( ڵ||Ǳ׷ڵ
             , 'STSS', '1. ֽ '
             , 'KQSS', '1. ֽ '
             , 'SDFU', '3. Ļ'
             , 'SDOP', '3. Ļ'
             , 'GDFU', '3. Ļ'
             , 'GDOP', '3. Ļ'
             , 'STEF', '3. Ļ'
             , 'STEW', '3. Ļ'
             , 'KQEF', '3. Ļ'
             , 'KQEW', '3. Ļ'
             , '2. ֽĿ ' ) з
     , COUNT(*) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM   ü
WHERE  ü = '20090315'
GROUP BY 
       DECODE( ڵ||Ǳ׷ڵ
             , 'STSS', '1. ֽ '
             , 'KQSS', '1. ֽ '
             , 'SDFU', '3. Ļ'
             , 'SDOP', '3. Ļ'
             , 'GDFU', '3. Ļ'
             , 'GDOP', '3. Ļ'
             , 'STEF', '3. Ļ'
             , 'STEW', '3. Ļ'
             , 'KQEF', '3. Ļ'
             , 'KQEW', '3. Ļ'
             , '2. ֽĿ ' )
ORDER BY 1 ;



DROP TABLE ǰз PURGE;

CREATE TABLE ǰз(ڵ, Ǳ׷ڵ, з)
AS
SELECT 'ST', 'SS', 'ֽ '    FROM DUAL UNION ALL
SELECT 'ST', 'EF', 'Ļ'         FROM DUAL UNION ALL
SELECT 'ST', 'EW', 'Ļ'         FROM DUAL UNION ALL
SELECT 'ST', 'DR', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'ST', 'SW', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'ST', 'RT', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'ST', 'BC', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'ST', 'MF', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'KQ', 'SS', 'ֽ '    FROM DUAL UNION ALL
SELECT 'KQ', 'EF', 'Ļ'         FROM DUAL UNION ALL
SELECT 'KQ', 'EW', 'Ļ'         FROM DUAL UNION ALL
SELECT 'KQ', 'DR', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'KQ', 'SW', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'KQ', 'RT', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'KQ', 'BC', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'KQ', 'MF', 'ֽĿ '  FROM DUAL UNION ALL
SELECT 'SD', 'FU', 'Ļ'         FROM DUAL UNION ALL
SELECT 'SD', 'OP', 'Ļ'         FROM DUAL UNION ALL
SELECT 'GD', 'FU', 'Ļ'         FROM DUAL UNION ALL
SELECT 'GD', 'OP', 'Ļ'         FROM DUAL ;

       
ALTER TABLE ǰз ADD 
CONSTRAINT ǰз_PK PRIMARY KEY(ڵ, Ǳ׷ڵ);
       
       
SELECT C. || '. ' || B.з ǰз 
     , SUM(üǼ) üǼ
     , SUM(ü) ü
     , SUM(üݾ) üݾ
FROM (SELECT ڵ, Ǳ׷ڵ
           , COUNT(*) üǼ
           , SUM(ü) ü
           , SUM(üݾ) üݾ
      FROM   ü
      WHERE  ü = '20090315'
      GROUP BY ڵ, Ǳ׷ڵ) A, ǰз B, з C
WHERE A.ڵ = B.ڵ
AND   A.Ǳ׷ڵ = B.Ǳ׷ڵ
AND   C.з = B.з
GROUP BY C. || '. ' || B.з
ORDER BY 1 ;


-- Լ Ǯ    

SELECT SUM(DECODE(SF_ǰз(ڵ, Ǳ׷ڵ), '1. ֽ ', ü))    "ֽ_ü"   
     , SUM(DECODE(SF_ǰз(ڵ, Ǳ׷ڵ), '2. ֽĿ ', ü))  "ֽĿ_ü" 
     , SUM(DECODE(SF_ǰз(ڵ, Ǳ׷ڵ), '3. Ļ', ü))         "Ļ_ü"       
FROM   ü
WHERE  ü = '20090315' ;


SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü"    
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü" 
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"       
FROM (
  SELECT SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
       , ü 
  FROM   ü
  WHERE  ü = '20090315'
) ;


SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü"    
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü" 
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"       
FROM (
  SELECT /*+ NO_MERGE */ SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
       , ü 
  FROM   ü
  WHERE  ü = '20090315'
) ;

SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü"    
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü" 
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"       
FROM (
  SELECT ROWNUM, SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
       , ü 
  FROM   ü
  WHERE  ü = '20090315'
) ;


SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü"    
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü" 
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"       
FROM (
  SELECT SF_ǰз(ڵ, Ǳ׷ڵ) ǰз
       , ü 
  FROM   ü
  WHERE  ü = '20090315'
  AND    ROWNUM > 0
) ;

  

  
SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü"    
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü" 
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"       
FROM (
  SELECT /*+ NO_MERGE */ 
        (SELECT SF_ǰз(ڵ, Ǳ׷ڵ) FROM DUAL) ǰз
       , ü 
  FROM   ü
  WHERE  ü = '20090315'
) ;

ALTER SESSION SET "_query_execution_cache_max_size" = 2097152;

SELECT SUM(DECODE(ǰз, '1. ֽ '  , ü)) "ֽ_ü" 
     , SUM(DECODE(ǰз, '2. ֽĿ ', ü)) "ֽĿ_ü"
     , SUM(DECODE(ǰз, '3. Ļ'       , ü)) "Ļ_ü"
FROM (
  SELECT /*+ NO_MERGE */ 
        (SELECT SF_ǰз(ڵ, Ǳ׷ڵ) FROM DUAL) ǰз
       , ü 
  FROM   ü 
  WHERE  ü = '20090315'
) ;


