2014-07-15 4 views
2

У меня есть инструкция sql, которая пытается получить строки, имеющие счет больше 1 для всех похожих строк. Во всех этих строках одно поле имеет нулевое значение.SQL в Oracle Group по NULL возвращает несколько строк

Случай 1:

Скажем, имя таблицы ABC


BUSINESS_UNIT, СЧЕТ, FLAG

A 1 (Null)

A 1 (Null)


SQL Statement: SELECT BUSINESS_UNIT, INVOICE, FLAG из таблицы ABC group by BUSINESS_UNIT, INVOICE, FLAG с COUNT (*)> 1

Я ожидаю, что он не вернет строки, поскольку оба флага в основном пусты. Но она возвращает


BUSINESS_UNIT, Invoice, FLAG

A 1 (Null)


Случай 2:

ТАБЛИЦА ABC


BUSINESS_UNIT, INVOICE, FLAG

А 1 (нуль)

А 1 (нуль)

В 1 1

В 1 (нуль)


инструкцию SQL: SELECT, BUSINESS_UNIT, СЧЕТ, ФЛАГ из группы ТАБЛИЦА ABC по BUSINESS_UNIT, счету, FLAG, имеющему COUNT (*)> 1

Я ожидаю, чтобы результат


BUSINESS_UNIT, СЧЕТ, FLAG

B 1 1


Это для Oracle 11g. Может ли кто-нибудь помочь в этом и сообщите мне, можем ли мы использовать любую из поставленных функций в Oracle?

После редактирования оригинальных операторов SQL.

Фактически я должен удалить флаг из группы и выбрать и добавить к счету, чтобы идентифицировать несколько флагов для похожих строк.


Спасибо!

ответ

0

Я думаю, что я нашел то, что я собирался искать.

ВЫБОР BUSINESS_UNIT, СЧЕТ из Таблицы АВС группы по BUSINESS_UNIT, СЧЕТ , имеющий COUNT (DISTINCT Flag)> 1

Случай 1: Это не возвращает ни одной строки

Случай 2: Он возвращает 1 строку


BUSINESS_UNIT, СЧЕТ

В 1


С благодарностью Рафаэль, Дноет и Гордон за вашу помощь в этом!

3

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

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

SELECT INVOICE 
from TABLE ABC 
where flag is not null 
group by BUSINESS_UNIT, INVOICE, FLAG 
having COUNT(*) >1 
+0

Спасибо за ответ Рафаэль, фильтр будет работать в случае 1, но для случая 2 он не будет работать должным образом. – startedFromTheBottom

+0

@startedFromTheBottom нет ничего, что могло бы заставить ваш второй запрос работать ... '1 <> NULL' –

+0

@startedFromTheBottom, за исключением случаев, когда флаг может быть только 1 или null. Это так, или нет? –

2

Это ваш первый запрос:

SELECT BUSINESS_UNIT, INVOICE, FLAG 
from TABLE ABC 
group by BUSINESS_UNIT, INVOICE, FLAG 
having COUNT(*) > 1; 

The count(*) возвращает количество строк в каждой группе. Одна из групп - flag, а значения NULL сгруппированы вместе. Если вы хотите, чтобы подсчитать непустые значения flag, то вы можете использовать:

SELECT BUSINESS_UNIT, INVOICE, FLAG 
from TABLE ABC 
group by BUSINESS_UNIT, INVOICE, FLAG 
having COUNT(flag) > 1; 

Или фильтр, как следует Рафаель Althaus.

Ваш второй запрос:

SELECT INVOICE 
from TABLE ABC 
group by BUSINESS_UNIT, INVOICE, FLAG 
having COUNT(*) > 1; 

Вы, кажется, волшебно хотите три колонки в выходном сигнале, когда есть только один столбец в select. Да, у вас может быть больше столбцов в group by, чем в select, если вы действительно этого хотите.

Ваш последний вопрос:

Может кто-то пожалуйста, помогите на эту и дайте мне знать, если мы можем использовать любой из поставляемых функций в Oracle?

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

+0

@ RaphaëlAlthaus. , , На моей клавиатуре нет этих забавных персонажей;) К счастью, вырезать-вставить. Приветствия. –

+0

О, я не просил, просто так;) Во всяком случае, просто шучу! –

+0

Спасибо за ответ Гордон, я пытаюсь определить количество строк, которые сгруппированы по тем же полям (бизнес-единица и счет-фактура), но имеет разные флаги в этих строках, а флаг равен нулю. Я обновил количество полей в SQL-заявлении для Case 2. Я думаю, что я допустил ошибку добавления флага в группу. – startedFromTheBottom

0

Помимо добавления WHERE-условие как предложено Рафаэлем Althaus вы можете также изменить количество (*) для подсчета (флаг):

SELECT INVOICE 
from TABLE ABC 
group by BUSINESS_UNIT, INVOICE, FLAG 
having COUNT(flag) >1 
+0

Hi dnoeth, Спасибо за ответ, я думаю, что не должен был добавлять FLAG в группу. Мы можем удалить FLAG из группы и использовать COUNT (флаг)> 1. Опять же, если для похожих строк есть два нуля, он будет извлекать строку, которую я бы не ожидал. – startedFromTheBottom

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