проблема нулевого значения оракула с группой по - PullRequest
0 голосов
/ 27 июля 2011

У меня есть запрос ниже:

SELECT EMAIL.MAILADDRESS, COUNT (DISTINCT CUSTOMER.CUSTOMER_ID) distinct_count
    FROM    (  SELECT CUSTOMER_ID,
                      TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI,
                      TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE,
                      'YES' AS MAILADDRESS
                 FROM ELECTRONIC_ADDRESS
                WHERE ADDRESS_TYPE = 'ELECTRONIC'
             GROUP BY CUSTOMER_ID) EMAIL
         RIGHT OUTER JOIN
            CUSTOMER
         ON (EMAIL.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID)
GROUP BY EMAIL.MAILADDRESS

Я присоединяюсь к таблицам электронной почты (подзапрос 'E' AS MAILADDRESS) и клиентов.У некоторых клиентов нет адреса электронной почты, поэтому я думаю, что результат должен выглядеть следующим образом:

MAILADDRESS        DISTINCT_COUNT
YES                      158945
NULL                      76345

Но когда я запускаю этот запрос, отображается только первая строка (адрес электронной почты которой YES)

Если я изменю условие EMAIL.MAILADDRESS на nvl (EMAIL.MAILADDRESS, 'NO') в выбранных столбцах и группирую по частям, запрос выполняется отлично.Но я не смог решить проблему и не могу изменить запрос, потому что этот запрос генерируется из Business Objects Universe.

Мы пишем эту часть:

   SELECT CUSTOMER_ID,
                  TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI,
                  TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE,
                  'YES' AS MAILADDRESS
             FROM ELECTRONIC_ADDRESS
            WHERE ADDRESS_TYPE = 'ELECTRONIC'
         GROUP BY CUSTOMER_ID

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

Как решить проблему?И почему Oracle не показывает нулевые значения?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Используя следующий SQL, я не смог воссоздать вашу проблему.

CREATE TABLE a1 (a NUMBER);

CREATE TABLE a2 (a NUMBER);

INSERT INTO a1
   SELECT     LEVEL
   FROM       DUAL
   CONNECT BY LEVEL <= 10;

INSERT INTO a2
   SELECT     LEVEL
   FROM       DUAL
   CONNECT BY LEVEL <= 20;

SELECT   a1.a, COUNT(DISTINCT a2.a)
FROM     a1 RIGHT OUTER JOIN a2 ON a1.a = a2.a
GROUP BY a1.a;

Это говорит о том, что проблема в данных, а не в SQL. Возможно ли, что когда у клиента нет адреса электронной почты, в таблице ELECTRONIC_ADDRESS все еще есть запись, но какой-то другой столбец имеет значение null?

В этом случае я бы изменил ваш подзапрос следующим образом (где «адрес» - это фактический столбец, содержащий адрес электронной почты):

   SELECT CUSTOMER_ID,
          TRUNC (MAX (UPDATE_DATE)) AS UPDATE_TARIHI,
          TRUNC (MIN (INSERT_DATE)) AS DATA_ENTRY_DATE,
          CASE WHEN ADDRESS IS NULL 
               THEN NULL 
               ELSE 'YES' 
               END AS MAILADDRESS
     FROM ELECTRONIC_ADDRESS
    WHERE ADDRESS_TYPE = 'ELECTRONIC'
 GROUP BY CUSTOMER_ID
0 голосов
/ 27 июля 2011

Вы говорите, что присоединяетесь к этому запросу

 select customer_id
       ,trunc(max(update_date)) as update_tarihi
       ,trunc(min(insert_date)) as data_entry_date
       ,'YES' as mailaddress
   from electronic_address
  where address_type = 'ELECTRONIC'
  group by customer_id

к столу клиента. не означает ли это, что вы получите только те записи, которые имеют адрес электронной почты (= 'ДА')?

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