2015-09-03 3 views
0

Я написал ниже запрос. Однако я не могу получить 0 в соответствующих подсчетах. Не могли бы вы сообщить мне, как я могу присоединиться к этому запросу для отображения 0?SQL для отображения 0 в подсчетах

SELECT b.collected  AS Last_Week_Collected,  
     a.collected  AS THIS_Week_Collected, 
     b.errored  AS Last_Week_Errored, 
     a.errored  AS THIS_Week_Errored, 
     b.processed  AS Last_Week_Processed, 
     a.processed  AS THIS_Week_Processed  
FROM (
      SELECT stream_id,collected, errored, processed 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY')= '03-09-2015' 
     ) a , 
     (
      SELECT stream_id,collected,errored ,processed 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY')= '27-08-2015' 
     ) b 
WHERE a.stream_id=b.stream_id; 
+2

Просьба отформатировать запрос. –

+0

не в состоянии понять ваш вопрос. –

+0

Вы, вероятно, хотите ['FULL JOIN'] (http://www.w3schools.com/sql/sql_join_full.asp), а не скрытое внутреннее соединение, которое вы написали. Тогда вы просто использовали бы «COALESCE», чтобы свести свои «NULL» отсутствующие результаты до 0. – GarethD

ответ

2

Глядя на ваш синтаксис, это выглядит, как вы используете базу данных Oracle. Таким образом, функция NVL должна работать для вас просто отлично. Кроме того, поскольку вы хотите вернуть 0 вместо нулевых значений, вместо inner join, вы хотели бы сделать какую-либо форму outer join (либо влево, вправо, либо в полном соответствии с вашими потребностями). Если вы хотите вернуть все строки из обоих запросов, вам нужно будет использовать FULL OUTER JOIN вместо так:

SELECT nvl(b.collected, 0) AS Last_Week_Collected 
    ,nvl(a.collected, 0) AS THIS_Week_Collected 
    ,nvl(b.errored, 0) AS Last_Week_Errored 
    ,nvl(a.errored, 0) AS THIS_Week_Errored 
    ,nvl(b.processed, 0) AS Last_Week_Processed 
    ,nvl(a.processed, 0) AS THIS_Week_Processed 
FROM (
    SELECT stream_id 
     ,collected 
     ,errored 
     ,processed 
    FROM processing_Stats_Archive 
    WHERE stream_id = '29' 
     AND HR_OF_DAY = '5' 
     AND TO_CHAR(batch_Creation_date, 'DD-MON-YY') = '03-09-2015' 
    ) a 
FULL OUTER JOIN (
    SELECT stream_id 
     ,collected 
     ,errored 
     ,processed 
    FROM processing_Stats_Archive 
    WHERE stream_id = '29' 
     AND HR_OF_DAY = '5' 
     AND TO_CHAR(batch_Creation_date, 'DD-MON-YY') = '27-08-2015' 
    ) b ON a.stream_id = b.stream_id; 
+0

Не работает там, где нет строк для указанных дат, Полное внешнее соединение не помогает – Shine

+1

Это сработало для меня .. Спасибо большое .. Я все еще проверяю больше .. действительно было полезно .. – user2642751

+0

Удивительный! Рад, что это сработало! :) – FutbolFan

0

может быть и хотят этот выход

SELECT COALESCE(b.collected,0) AS Last_Week_Collected 
,a.collected AS THIS_Week_Collected 
,COALESCE(b.errored,0) AS Last_Week_Errored 
,a.errored AS THIS_Week_Errored 
,COALESCE(b.processed,0) AS Last_Week_Processed 
,a.processed AS THIS_Week_Processed 
FROM 
(
SELECT stream_id,collected,errored ,processed 
FROM processing_Stats_Archive 
WHERE stream_id = '29' AND HR_OF_DAY ='5' 
AND TO_CHAR(batch_Creation_date,'DD-MON-YY')= '03-09-2015' 
)a LEFT JOIN 
(
SELECT stream_id,collected,errored ,processed 
FROM processing_Stats_Archive 
WHERE stream_id = '29' AND HR_OF_DAY ='5' AND TO_CHAR(batch_Creation_date,'DD-MON-YY')= '27-08-2015' 
) 
b ON a.stream_id=b.stream_id 
+0

Привет Raj ... все еще вывод выглядит так же, как и строки, идущие .. – user2642751

+0

@ user2642751 затем заменить внутреннее соединение левым соединением .. у меня есть обновление my ans..look it –

+0

левого соединения недостаточно, если нет строк с stream_id = '29' И HR_OF_DAY = '5' в обработке_Stats_Archive Таблица – Shine

0

Идея заключается в том, что нет тип соединения или агрегатные функции (например, MAX) поможет вам, если есть ничего для объединения или объединения. Вы должны работать с отдельными запросами, чтобы извлекать одиночные «собранные», «ошибочные» и «обработанные» столбцы И объединить их в 0. Я использовал NVL в своем ответе здесь, думая, что вы используете Oracle DBMS

Попробуйте следующее:

SELECT (
     NVL(SELECT collected 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '03-09-2015' ,0) 
     AS THIS_Week_Errored, 
      NVL(SELECT errored 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '03-09-2015' ,0) 
     AS THIS_Week_Errored, 
      NVL (SELECT processed 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '03-09-2015' ,0) 
     AS THIS_Week_Processed) 
     UNION 
     NVL(SELECT collected 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '27-08-2015' ,0) 
     AS Last_Week_Collected, 
      NVL(SELECT errored 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '27-08-2015' ,0) 
     AS Last_Week_Errored, 
      NVL (SELECT processed 
      FROM processing_Stats_Archive 
      WHERE stream_id = '29' 
      AND HR_OF_DAY ='5' 
      AND TO_CHAR(batch_Creation_date,'DD-MON-YY') = '27-08-2015' ,0) 
     AS Last_Week_Processed) 
    FROM DUAL 
+0

Это, вероятно, работает, но довольно плохое решение, вы читаете из той же таблицы 6 раз, когда можете сделать это в одном чтении. – GarethD

+0

Я согласен, это плохое решение – Shine

+0

Есть недостающее выражение. который я все еще ищу ... – user2642751

1

Вы можете сделать это с помощью условного агрегата:

SELECT NVL(Last_Week_Collected, 0) AS Last_Week_Collected, 
     NVL(THIS_Week_Collected, 0) AS THIS_Week_Collected, 
     NVL(Last_Week_Errored, 0) AS Last_Week_Errored, 
     NVL(THIS_Week_Errored, 0) AS THIS_Week_Errored, 
     NVL(Last_Week_Processed, 0) AS Last_Week_Processed, 
     NVL(THIS_Week_Processed, 0) AS THIS_Week_Processed 
FROM  
( SELECT MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '27-08-2015' THEN collected ELSE 0 END) AS Last_Week_Collected,  
      MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '03-09-2015' THEN collected ELSE 0 END) AS THIS_Week_Collected, 
      MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '27-08-2015' THEN errored ELSE 0 END) AS Last_Week_Errored, 
      MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '03-09-2015' THEN errored ELSE 0 END) AS THIS_Week_Errored, 
      MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '27-08-2015' THEN processed ELSE 0 END) AS Last_Week_Processed, 
      MAX(CASE WHEN TO_CHAR(batch_Creation_date,'DD-MON-YY')= '03-09-2015' THEN processed ELSE 0 END) AS THIS_Week_Processed 
    FROM processing_Stats_Archive 
    WHERE stream_id = '29' 
    AND  HR_OF_DAY ='5' 
    AND  TO_CHAR(batch_Creation_date,'DD-MON-YY') IN ('27-08-2015', '03-09-2015') 
) t; 

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

Это скалярный агрегат, то есть он имеет агрегатную функцию и не имеет группы, он всегда будет возвращать одну строку, независимо от того, имеются или нет данные.

+0

Если бы не было строк для указанных дат, вы бы ничего не получили – Shine

+2

@Shine - 'ничего не получал' ?? – MatBailie

+0

Да, я думаю, что ваш ответ неправильный. Если в БД нет ни одной строки для обеих дат, вы бы не выбрали строку, и ваши CASE-файлы не могли бы выполняться даже – Shine

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