2013-04-08 7 views
0

У меня есть требование вытащить данные ниже.счет от текущей строки до последней строки

progress_CMC_status progress_cmc_status_numbers cmc_status_numbers 
Mature Draft       2       5 
Review        0       3 
Final Draft       0       3 
Final Comment      0       3 
Final Document      2       3 
Archived Document     1       1 

, но я получаю выход в различных

progress_CMC_status progress_cmc_status_numbers cmc_status_numbers 
Mature Draft       2       5 
Review        0       0 
Final Draft       0       0 
Final Comment      0       0 
Final Document      2       3 
Archived Document     1       1 

Попробовал код ниже:

WITH sta AS 
    (SELECT 'Mature' "status1" 
    FROM DUAL 
    UNION 
    SELECT 'Review' 
    FROM DUAL 
    UNION 
    SELECT 'Final Draft' 
    FROM DUAL 
    UNION 
    SELECT 'Final Comment' 
    FROM DUAL 
    UNION 
    SELECT 'Final Document' 
    FROM DUAL 
    UNION 
    SELECT 'Archived' 
    FROM DUAL) 
    SELECT DECODE ("stat", 
      'Mature', 'Mature Draft', 
      'Review', 'Review', 
      'Final Draft', 'Final Draft', 
      'Final Comment', 'Final Comment', 
      'Final Document', 'Final Document', 
      'Archived', 'Archived Document' 
      ) AS "progress_CMC_status", 
    NVL 
     (TO_CHAR ("progress_cmc_status_numbers"), 
     0 
     ) AS "progress_cmc_status_numbers", 
    NVL (TO_CHAR ("cmc_status_numbers"), 0) AS "cmc_status_numbers" 
    FROM (SELECT "status1" AS "stat", 
      NVL 
       (TO_CHAR (NULL), 
       "progress_cmc_status_numbers" 
       ) AS "progress_cmc_status_numbers", 
      NVL (TO_CHAR (NULL), 
        "cmc_status_numbers" 
       ) AS "cmc_status_numbers" 
    FROM sta 
    LEFT JOIN 
    (SELECT VALUE AS "progress_CMC_status", 
         COUNT (*) AS "progress_cmc_status_numbers", 
         SUM (COUNT (*)) OVER (ORDER BY DECODE 
                 (VALUE, 
                 'Mature', 0, 
                 'Review', 1, 
                 'Final Draft', 2, 
                 'Final Comment', 3, 
                 'Final Document', 4, 
                 'Archived', 5, 
                 6 
                 ) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
                AS "cmc_status_numbers" 
        FROM ATTRIBUTES 
       WHERE attribute_type_id IN (
              SELECT attribute_type_id 
               FROM attribute_types 
              WHERE name_display_code = 
                     'RD') 
        AND VALUE IN 
          ('Mature', 'Review', 'Final Draft', 
          'Final Comment', 'Final Document', 'Archived') 
        AND object_id IN (SELECT obj_id 
             FROM docs) 
       GROUP BY VALUE) a1 ON sta."status1" = 
                a1."progress_CMC_status" 
      ) 
    ORDER BY DECODE ("progress_CMC_status", 
      'Mature Draft', 0, 
      'Review', 1, 
      'Final Draft', 2, 
      'Final Comment', 3, 
      'Final Document', 4, 
      'Archived Document', 5, 
      6 
      ) 

образец данных

  CREATE TABLE ATTRIBUTES 
     (
     object_id NUMBER(4), 
     attribute_type_id NUMBER(4), 
     name_display_code VARCHAR2(5), 
     VALUE VARCHAR2(25) 
     ); 

     begin 
     insert into attributes values (101,201,'RMD','A100'); 
     insert into attributes values (102,201,'RMD','A200'); 
     insert into attributes values (103,201,'RMD','A300'); 
     insert into attributes values (104,200,'RD','Mature'); 
     insert into attributes values (105,200,'RD','Mature'); 
     insert into attributes values (106,200,'RD','Mature'); 
     insert into attributes values (107,200,'RD','Mature'); 
     insert into attributes values (108,200,'RD','Mature'); 
     insert into attributes values (109,200,'RD','Archived'); 
     insert into attributes values (110,200,'RD','Archived'); 
     insert into attributes values (111,200,'RD','Archived'); 
     insert into attributes values (112,200,'RD','Archived'); 
     insert into attributes values (113,200,'RD','Mature'); 
     insert into attributes values (114,200,'RD','Mature'); 
     insert into attributes values (115,200,'RD','Mature'); 
     insert into attributes values (116,200,'RD','Mature'); 
     insert into attributes values (117,200,'RD','Final Document'); 
     insert into attributes values (118,200,'RD','Final Document'); 
     insert into attributes values (119,201,'RMD','A400'); 
     insert into attributes values (120,201,'RMD','A500'); 
     end; 
     /

     CREATE TABLE docs 
     (
     obj_id NUMBER(4) 
     ); 


     BEGIN 
     INSERT INTO docs 
     VALUES (100); 

     INSERT INTO docs 
     VALUES (104); 

     INSERT INTO docs 
     VALUES (109); 

     INSERT INTO docs 
     VALUES (117); 

     INSERT INTO docs 
     VALUES (118); 

     INSERT INTO docs 
     VALUES (119); 

     INSERT INTO docs 
     VALUES (120); 
     END; 
     /


     CREATE TABLE attribute_types 
     (
     attribute_type_id NUMBER(4), 
     name_display_code VARCHAR2(5) 
     ); 


     INSERT INTO attribute_types 
     VALUES (200, 'RD'); 


     INSERT INTO attribute_types 
     VALUES (201, 'RMD'); 
+0

Вы хотите, чтобы «ни одна из вышеперечисленных» работ ('ordr = 6') не была частью результатов каким-либо образом? Например, если есть работа под названием «ПРОГРАММА», как это повлияет на ваши результаты? –

+0

извините ... я забыл поместить фильтр, как в задание на работу (эти 6 заданий.), Нужно всего лишь выделить 6 значений. Если вы хотите, я обновлю запрос. – ravt

+0

Не нужно это делать; может быть другой вопрос или два. Я посмотрю, смогу ли я что-нибудь придумать. –

ответ

1
WITH sta AS 
    (SELECT 'Mature' "status1" FROM DUAL UNION 
    SELECT 'Review' FROM DUAL UNION 
    SELECT 'Final Draft' FROM DUAL UNION 
    SELECT 'Final Comment' FROM DUAL UNION 
    SELECT 'Final Document' FROM DUAL UNION 
    SELECT 'Archived' FROM DUAL) 
SELECT 
    DECODE ("stat", 
      'Mature', 'Mature Draft', 
      'Review', 'Review', 
      'Final Draft', 'Final Draft', 
      'Final Comment', 'Final Comment', 
      'Final Document', 'Final Document', 
      'Archived', 'Archived Document' 
) AS "progress_CMC_status", 
    NVL("progress_cmc_status_numbers", 0) AS "progress_cmc_status_numbers", 
    SUM (NVL("progress_cmc_status_numbers", 0)) OVER (ORDER BY 
      -DECODE ("stat", 
      'Mature', 0, 
      'Review', 1, 
      'Final Draft', 2, 
      'Final Comment', 3, 
      'Final Document', 4, 
      'Archived', 5, 
      6) 
    ) AS "cmc_status_numbers" 
FROM 
    (
    SELECT 
     "status1" AS "stat", 
     "progress_cmc_status_numbers" 
    FROM 
     sta 
     LEFT JOIN (
     SELECT 
      VALUE AS "progress_CMC_status", 
      COUNT (*) AS "progress_cmc_status_numbers" 
     FROM ATTRIBUTES 
     WHERE 
      attribute_type_id IN (
      SELECT attribute_type_id 
      FROM attribute_types 
      WHERE name_display_code = 'RD' 
     ) 
      AND VALUE IN ('Mature', 'Review', 'Final Draft', 
      'Final Comment', 'Final Document', 'Archived') 
      AND object_id IN (SELECT obj_id FROM docs) 
     GROUP BY VALUE 
    ) a1 ON sta."status1" = a1."progress_CMC_status" 
) 
    ORDER BY DECODE ("progress_CMC_status", 
      'Mature Draft', 0, 
      'Review', 1, 
      'Final Draft', 2, 
      'Final Comment', 3, 
      'Final Document', 4, 
      'Archived Document', 5, 
      6) 

fiddle

+0

привет, спасибо за ответ. здесь мне нужно левое соединение, чтобы вытащить недостающие данные. – ravt

+0

@ravt - Просто замените свой подзапрос (под LEFT JOIN) моим. –

+0

привет, я попробовал, но не повезло .. предположим, если у задания есть бонус <4000, то это не участвует в столбце cnt. не могли бы вы посмотреть на это. – ravt

Смежные вопросы