Как отобразить 0, если количество различных значений равно нулю? - PullRequest
1 голос
/ 19 января 2012

Моя таблица имеет X разных поставщиков, у каждого из этих поставщиков есть Y целей (включая ни одного)

vendor varchar2(100),
location varchar2(100),
type varchar2(100),
rating varchar2(20),
control_objective varchar2(1000)

теперь мне нужно отобразить гистограммукоторый работает на следующем скрипте

select trim(vendor)||' '||trim(location)||' '||trim(type1) AS vendor_location,
       count(distinct control_objective) as "Cont Obj" 
from some_table
where (Rating = 'Needs improvement' or Rating = 'Unacceptable') and 
      "Year" = '2011' and 
      Quarter = 'Q3'
group by trim(vendor)||' '||trim(location)||' '||trim(type1)
order by trim(vendor)||' '||trim(location)||' '||trim(type1);

и производит следующий вывод

-----vendor_location----Cont Obj
1----Big Blue Car---------5
2----Big Red Car----------4
3----Small Pink Truck-----4
4----Small White Truck----2

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

-----vendor_location----Cont Obj
1----Big Blue Car---------5
2----Big Red Car----------4
3----Small Pink Truck-----4
4----Small White Truck----2
5----Big White Van--------0

Причина в том, что скрипт подает значения в гистограмму, поэтому мне нужно значение 0 на графике.Я пробовал несколько способов преодоления этого, который опубликован ниже

select trim(vendor)||' '||trim(location)||' '||trim(type1) AS vendor_location,
       count(distinct nvl(control_objective,0)) as "Cont Obj" 
from some_table
where (Rating = 'Needs improvement' or Rating = 'Unacceptable') and 
      "Year" = '2011' and 
      Quarter = 'Q3'
group by trim(vendor)||' '||trim(location)||' '||trim(type1)
order by trim(vendor)||' '||trim(location)||' '||trim(type1);

и

select trim(vendor)||' '||trim(location)||' '||trim(type1) AS vendor_location,
       (count(distinct control_objective)+0) as "Cont Obj" from some_table
where (Rating = 'Needs improvement' or Rating = 'Unacceptable') and 
      "Year" = '2011' and 
      Quarter = 'Q3'
group by trim(vendor)||' '||trim(location)||' '||trim(type1)
order by trim(vendor)||' '||trim(location)||' '||trim(type1);

и

select trim(vendor)||' '||trim(location)||' '||trim(type1) AS vendor_location,
       case when (count(distinct control_objective)<1) 
            then 0 
            else count(distinct control_objective) 
       end as "Cont Obj" 
from some_table
where (Rating = 'Needs improvement' or Rating = 'Unacceptable') and 
      "Year" = '2011' and 
      Quarter = 'Q3'
group by trim(vendor)||' '||trim(location)||' '||trim(type1)
order by trim(vendor)||' '||trim(location)||' '||trim(type1);

Все вышеупомянутые попытки дали мне то же самоевывод, как я получил ранее.

Честно говоря, я не могу придумать больше способов.Последний вариант , который у меня есть, - записать вывод в таблицу, вручную ввести пропущенные значения и затем отобразить таблицу.Но это на самом деле не то, что я хочу, потому что сценарий должен работать в течение будущих кварталов и лет.Таким образом, в будущем некоторые другие значения могут быть нулевыми, а запись и чтение в таблицу лишают цели быть «ориентированными на будущее», поэтому, по сути, это не вариант, а просто быстрое исправление наступающего срока.

Я использую SQL Developer для тестирования сценариев, а база данных - Oracle 11g

PS Если это невозможно, дайте мне знать.Я даже открыт для того, чтобы быть ответом !!У меня нет большого опыта работы с SQL.

РЕДАКТИРОВАТЬ

Спасибо всем.Я понял свою проблему по пути домой.Состояние рейтинга не удовлетворялось, но не смог опубликовать его, пока я не вернусь домой.Большое спасибо Марсину!

Ответы [ 2 ]

5 голосов
/ 19 января 2012

Вы должны увидеть «Большой белый фургон», если он находится в таблице, а другие поля (Рейтинг, Год, Квартал) удовлетворяют вашему условию. Я думаю, вам скорее нужно что-то вроде этого:

select trim(vendor) || ' ' || trim(location) || ' ' || trim(type1) AS vendor_location,
       count(distinct case
               when (Rating = 'Needs improvement' or Rating = 'Unacceptable') and "Year" = '2011' and Quarter = 'Q3' then
                control_objective
               else
                null
             end) as "Cont Obj"
  from some_table
 group by trim(vendor) || ' ' || trim(location) || ' ' || trim(type1)
 order by trim(vendor) || ' ' || trim(location) || ' ' || trim(type1);

, что означает: предоставьте мне все vendor_locations и для каждого покажите мне количество различных значений control_objective из тех записей, для которых (Рейтинг = «Требуется улучшение» или Рейтинг = «Недопустимый») и «Год» = «2011» и Квартал = 'Q3'

1 голос
/ 19 января 2012

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

SELECT a, COUNT(DISTINCT b)
FROM (
    SELECT 'a' a, 'b' b FROM dual UNION ALL
    SELECT 'b', NULL FROM dual UNION ALL
    SELECT 'b', NULL FROM dual
)
GROUP BY a

->

b - 0
a - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...