Как сделать сводный запрос, который не возвращает строк, вместо этого возвращает ноль. (Oracle SQL) - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть запрос, который структурирован следующим образом:

SELECT
                        "result1"                   
                    ,   "result2" 
                    ,   "result3" 

FROM
(    
    SELECT number, position
    FROM values val
    FULL JOIN values2 val2 ON val.id = val2.id
    WHERE val.code = 'example'
    AND val.number IS NOT NULL
)
PIVOT
(
  MAX(number)
  FOR position IN(
    1  AS "result1",
    2  AS "result2",
    3  AS "result3"
  )
);

Для случая, когда он не возвращает значений, я хочу, чтобы он возвращал нулевые значения вместо пустой строки.

Как бы мне этого добиться? Мне не удалось заставить часто предлагаемые решения работать из-за оси.

E:

Результат, который я получил:

Строка не возвращена:

enter image description here

Результат, который я хочу:

Одна строка, возвращенная с нулевыми значениями

enter image description here

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Проблема не в PIVOT, а в подзапросе до PIVOT, и ваш вопрос может быть уменьшен до:

Как я могу получить запрос (переименовывая ваш идентификаторы, имеющие допустимые значения):

SELECT num,
       position
FROM   values1 val
       FULL OUTER JOIN values2 val2
       ON val.id = val2.id
WHERE  val.code = 'example'
AND    val.num IS NOT NULL

чтобы всегда возвращать хотя бы одну строку?

Если у вас есть тестовые данные:

CREATE TABLE values1 ( id, code, num ) AS
SELECT 1, 'example',     NULL FROM DUAL UNION ALL
SELECT 2, 'not_example', 1    FROM DUAL;

CREATE TABLE values2 ( id, position ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 1, 2 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 2, 3 FROM DUAL;

Тогда в вашем предложении WHERE нет строки, которая соответствовала бы условиям фильтра, и в PIVOT будет ноль строк, поэтому запрос всегда будет возвращать ноль строк. В этом случае вы можете использовать UNION ALL, чтобы добавить строку:

SELECT num,
       position
FROM   values1 val
       FULL OUTER JOIN values2 val2
       ON val.id = val2.id
WHERE  val.code = 'example'
AND    val.num IS NOT NULL
UNION ALL
SELECT NULL,
       NULL
FROM   DUAL
WHERE  NOT EXISTS (
  SELECT 1
  FROM   value1
  WHERE  code = 'example'
  AND    num IS NOT NULL
)

, которая будет выводить:

 NUM | POSITION
---: | -------:
<em>null</em> |     <em>null</em>

И затем обернутая вокруг оси:

SELECT *
FROM
(    
  SELECT num,
         position
  FROM   values1 val
         FULL OUTER JOIN values2 val2
         ON val.id = val2.id
  WHERE  val.code = 'example'
  AND    val.num IS NOT NULL
  UNION ALL
  SELECT NULL,
         NULL
  FROM   DUAL
  WHERE  NOT EXISTS (
    SELECT 1
    FROM   values1
    WHERE  code = 'example'
    AND    num IS NOT NULL
  )
)
PIVOT ( MAX(num) FOR position IN (
  1  AS "result1",
  2  AS "result2",
  3  AS "result3"
));

Выходы:

result1 | result2 | result3
------: | ------: | ------:
   <em>null</em> |    <em>null</em> |    <em>null</em>

дБ <> скрипка здесь

0 голосов
/ 27 февраля 2020

Я решил свою проблему, создав представление из этого запроса и вызвав его следующим образом:

SELECT                   NVL(MIN(result1), null)                
                    ,    NVL(MIN(result2), null)    
                    ,    NVL(MIN(result3), null)    
FROM schema.view;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...