2014-11-07 2 views
1

GOALDB2 SELECT COUNT, если NULL, то по умолчанию 0

Я пытаюсь выбрать идентификатор пользователя из одной таблицы и количество сопутствующих элементов из другой таблицы в DB2. Я пытаюсь выполнить этот запрос в SSIS, чтобы импортировать данные в базу данных SQL Server, где я буду выполнять дополнительные процессы преобразования данных. Я упоминаю SSIS не потому, что думаю свою часть проблемы, а только для справочной информации. Я уверен, что проблема связана с моей неопытной работой в DB2. Мой опыт в SQL Server, я очень новичок в DB2.

ВЫПУСК

Проблема возникает, когда (я предполагаю) счетчик равен 0. Когда я выполнить запрос в моих командах DB2 редакторе, он просто возвращает пустую строку. Я ожидаю, что он, по крайней мере, вернет идентификатор пользователя, а затем просто получит пустое поле для подсчета, но вместо этого вся строка пуста. Это вызывает проблемы с моим пакетом SSIS, где он пытается создать кучу вставок без данных.

Опять же, это предположение, потому что я не испытываю DB2 Command Editor или DB2, но если я немного открою даты, я получу ожидаемые результаты (идентификатор пользователя и количество).

Я попытался обернуть счет в функции COALESCE(), но это не решило проблему.

QUERY

SELECT a.user_id, COUNT(DISTINCT b.item_number) as Count 
FROM TABLE_A a 
LEFT OUTER JOIN TABLE_B b 
ON a.PRIMARY_KEY = b.PRIMARY_KEY 
WHERE a.user_id = '1234' 
AND b.DATE_1 >= '01/01/2013' 
AND b.DATE_1 <= '01/05/2013' 
AND b.DATE_2 >= '01/01/2013' 
AND b.DATE_2 <= '12/23/2014' 
AND a.OTHER_FILTER_FIELD = 'ABC' 
GROUP BY a.user_id 
+1

Ваше внешнее соединение является фактически внутренним соединением, потому что вы применяете предикаты к TABLE_B _after_ join, поэтому несогласованные строки исключаются. Поместите связанные с датой предикаты _into_ условие соединения. – mustaccio

ответ

0

Wrap поле в COALESCE()

COUNT(DISTINCT COALESCE(b.item_number,0)) 

также убедитесь, что

WHERE a.user_id = '1234' 

существует в TABLE_A. Если нет пользователя 1234, вы не получите никаких результатов с запросом, как написано.

+0

Я проверял, существует ли пользователь. Если я разберу даты, чтобы они были похожи на год, я получу ожидаемые результаты, но даты даты узкие, где ожидаемый счетчик может быть 0, я получаю только пустую белую строку в редакторе команд DB2. Это происходит, когда я добавляю функцию COALESCE(). Я бы загрузил экранный снимок окна результатов, но мне не хватает репутации. окно результатов выглядит странно, потому что на столбцах нет границ, как вы обычно ожидали, его просто пустой белый ряд. – Jon

+0

Я вижу, что он делает. Это выглядит странно, потому что нет строк, возвращающихся. Если я делаю запрос, который фактически получает результат, он показывает нормальную запись с границами, а затем ту же самую белую строку под этим, так что это имеет смысл. Я просто не получаю никаких результатов, что странно. Я ожидал бы, по крайней мере, получить user_id – Jon

+0

Я думаю, вам нужно взглянуть на ваше предложение where. Похоже, у вас есть опечатка. Поскольку я не знаю, что вы пытаетесь сделать, я не могу сказать, но мне кажется, что если изменение дат даст вам результаты, то, возможно, бизнес-правила не соответствуют вашему предложению where. – Hogan

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