Как сообщить метку с 0 (ноль), если она не найдена в результате в сложной инструкции CASE - PullRequest
0 голосов
/ 26 сентября 2019

В целях отчетности мне нужно создать на первый взгляд очень простой отчет, только создать его - задача!Значения должны быть изменены для меток, а количество вхождений каждой метки должно быть подсчитано.

Я уже создал запрос, который выглядит нормально, только он не показывает метку, когда нет вхождений.

Это код, который я сейчас использую.

COLUMN c1 HEADING "Entity" FORMAT A8
COLUMN c2 HEADING "Quantity" FORMAT 9999999
BREAK ON c1
SELECT (CASE 
         WHEN cat_code = '1234'
          AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                                FROM product_codes
                                              WHERE SUBSTR(prod_code,1,5) != 12345
                                                AND SUBSTR(prod_code,1,6) != 987654
                                             )  
          THEN 'AAA_X'
        WHEN cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                               FROM product_codes
                                             WHERE SUBSTR(prod_code,1,5) != 12345
                                               AND SUBSTR(prod_code,1,6) != 987654
                                            )   
          THEN 'AAA_Y'
        WHEN cat_code = '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 'BBB_X'
        WHEN cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 'BBB_Y'
       END) c1
     , COUNT(*) c2
FROM purchases
WHERE end_time >= '&1'
  AND end_time <  '&2'
GROUP BY (CASE 
         WHEN cat_code = '1234'
          AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                                FROM product_codes
                                              WHERE SUBSTR(prod_code,1,5) != 12345
                                                AND SUBSTR(prod_code,1,6) != 987654
                                             )  
          THEN 'AAA_X'
        WHEN cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                               FROM product_codes
                                             WHERE SUBSTR(prod_code,1,5) != 12345
                                               AND SUBSTR(prod_code,1,6) != 987654
                                            )   
          THEN 'AAA_Y'
        WHEN cat_code = '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 'BBB_X'
        WHEN cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 'BBB_Y'
       END)
ORDER BY 1;

Для меток BBB_X и BBB_Y в базе данных еще нет данных, что не отражается в отчете.Результат, который я ищу, будет похож на этот пример.

Entity;Quantity
------ --------
AAA_X ;  123456
AAA_Y ;  654321
BBB_X ;       0
BBB_Y ;       0

1 Ответ

0 голосов
/ 26 сентября 2019

AAA_X,AAA_Y,BBB_X,BBB_Y значения получены из некоторого выражения, и это слишком константа в вашем случае.так что вы можете получить желаемый результат, передав логику в функцию агрегирования и используя AAA_X,AAA_Y,BBB_X,BBB_Y в качестве базовых данных следующим образом:

WITH BASE_DATA AS (
SELECT REGEXP_SUBSTR(D,'[^,]+', 1, LEVEL) AS C1 FROM
    (SELECT 'AAA_X,AAA_Y,BBB_X,BBB_Y' D FROM DUAL)
CONNECT BY REGEXP_SUBSTR(D,'[^,]+', 1, LEVEL) IS NOT NULL
)
SELECT b.C1, SUM (CASE 
         WHEN b.C1 = 'AAA_X' AND cat_code = '1234'
          AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                                FROM product_codes
                                              WHERE SUBSTR(prod_code,1,5) != 12345
                                                AND SUBSTR(prod_code,1,6) != 987654
                                             )  
          THEN 1
        WHEN b.C1 = 'AAA_Y' AND cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) IN (SELECT SUBSTR(prod_code,1,6)
                                               FROM product_codes
                                             WHERE SUBSTR(prod_code,1,5) != 12345
                                               AND SUBSTR(prod_code,1,6) != 987654
                                            )   
          THEN 1
        WHEN b.C1 = 'BBB_X' AND cat_code = '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 1
        WHEN b.C1 = 'BBB_Y' AND cat_code != '1234'
         AND SUBSTR(prod_nbr,1,6) NOT IN (SELECT SUBSTR(prod_code,1,6)
                                                   FROM product_codes
                                                 )  
             THEN 1
       END) c2
    -- , COUNT(*) c2
FROM BASE_DATA b LEFT JOIN purchases p ON (1 = 1)
WHERE end_time >= '&1'
  AND end_time <  '&2'
GROUP BY b.C1
ORDER BY 1;

Cheers !!

...