Как вернуть данные, где Null означает ноль?

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

Word   Chapter   Count
dog    1         3
dog    2         7
dog    3         1
cat    2         4

Обратите внимание, что в главах 1 и 3 нет строки для слова «кошка», потому что там это слово не использовалось.

Мне нужно ВЫБРАТЬ В временную таблицу (при подготовке к другой агрегации и т. д.) указанные выше данные, но мне нужно, чтобы «кошка» отображалась для глав 1 и 3 со счетом 0. Результат должен быть:

Word   Chapter   Count
dog    1         3
dog    2         7
dog    3         1
cat    1         0
cat    2         4
cat    3         0

Любые советы будут высоко оценены. Спасибо.


person HumanJHawkins    schedule 24.04.2013    source источник
comment
Для подсчета, который вы пытаетесь вернуть, есть ли слова, для которых вам нужен подсчет, которых нет в текущей таблице? Кроме того, возможно ли, что в таблице, с которой вы работаете, есть главы, для которых нет записей? Например, есть ли глава 4, в которой нет ни cat, ни dog, и поэтому нет записи в вашей таблице?   -  person pcurry    schedule 24.04.2013
comment
Я понимаю, что плохо выразился. Предлагаемые решения не работают, потому что на самом деле у меня даже нет NULL для преобразования в 0. Ни ISNULL, ни COALESCE не работают, потому что строки не существуют. Я попытался создать временную таблицу только из глав, чтобы заставить одну строку на главу на слово, но в зависимости от соединения я получаю либо слишком много, либо слишком мало строк.   -  person HumanJHawkins    schedule 24.04.2013
comment
@pcurry, на самом деле существует 14 точек данных, аналогичных главам, миллионы строк символов, аналогичных словам, и это частота с плавающей запятой, а не счет. Я просто пытаюсь сохранить простоту. Я почти уверен, что если я смогу понять, как вывести строки для «кошки» главы 1 и 3 (без добавления ложных данных, таких как строка для «кошки», которая фактически содержит количество для «собака»), Я могу применить этот принцип к моим реальным данным.   -  person HumanJHawkins    schedule 24.04.2013


Ответы (4)


Я не знаю вашей структуры данных, но я думаю, что вы пытаетесь сделать следующее:

create table Chapters (Chapter int);
insert Chapters values (1);
insert Chapters values (2);
insert Chapters values (3);

create table Words (Word varchar(50));
insert into Words values ('dog');
insert into Words values ('cat');

create table Chapters_Words (Word varchar(50), Chapter int, [Count] int);
insert into Chapters_Words values ('dog', 1, 3);
insert into Chapters_Words values ('dog', 2, 7);
insert into Chapters_Words values ('dog', 3, 1);
insert into Chapters_Words values ('cat', 2, 4);

select
    f.Word, 
    f.Chapter, 
    isnull(w.[Count], 0) [Count]
from
    Chapters_Words w
    right join (
        select w.Word, c.Chapter
        from Chapters c
        cross join Words w
    ) f on f.Chapter = w.Chapter and f.Word = w.Word

Результат:

Word                                               Chapter     Count
-------------------------------------------------- ----------- -----------
dog                                                1           3
dog                                                2           7
dog                                                3           1
cat                                                1           0
cat                                                2           4
cat                                                3           0
person Dan    schedule 24.04.2013
comment
Спасибо большое. Кажется, это работает. CROSS JOIN — это то, чего мне не хватало. - person HumanJHawkins; 25.04.2013

Null НЕ означает ноль, и "ноль" не означает null.

Вздох...

Сказав это, функция «coalesce()» является популярной, в зависимости от вашей реализации СУБД: COALESCE with NULL< /а>.

См. также Функции SQL ISNULL(), NVL(), IFNULL() и COALESCE()

person paulsm4    schedule 24.04.2013
comment
Я понимаю, что NULL обычно не означает ноль, но в данном случае это так. Это означает, что отсутствие значения в этом случае является убедительным доказательством того, что счетчик равен нулю. Спасибо за совет. - person HumanJHawkins; 24.04.2013

Я считаю, что вам нужно COALESCE

COALESCE(Count, 0) 

Полный пример:

SELECT Word, Chapter, COALESCE(Count, 0)
FROM YourTable
person Darren    schedule 24.04.2013
comment
Поскольку на самом деле нет строки для «кошки» в главе 1, это не работает. Я попробовал это, и результат такой же, как и при прямом выборе. Спасибо хоть. - person HumanJHawkins; 25.04.2013

Зависит от того, что вы делаете? Вы можете использовать внешнее соединение, если строки выпадают. В Oracle вы можете nvl() изменить null на что-то другое. Например, до нуля в сумме.

person asusu    schedule 24.04.2013