Правильно сделать внешнее соединение в той же таблице

У меня есть следующий запрос

SELECT DISTINCT P.CUSTUM_ID, P.STATUS, M.DATE_RATE, PP.PRICE_USR, PP.DISC
FROM MBR_INFO AS M
INNER JOIN PARENT_INFO AS P
  on M.CUSTUM_ID = P.CUSTUM_ID
INNER JOIN PRICE_PARENT PP
  on P.CUSTUM_ID = PP.CUSTUM_ID
WHERE M.DATE_RATE > (getDate())
  and P.USER_FLAG = 'Y'
order by M.DATE_RATE;

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

|   CUSTUM_ID   |   STATUS  |   DATE_RATE   |   STATU   |   ORIG_P  |   PRICE_U |   DISC
---------------------------------------------------------------------------------------------
|   12345678    |   USER    |   2015-05-19  |   NULL    |   0.00    |   2990.00 |   0.00
|   12345678    |   NONUSR  |   2015-05-19  |   NULL    |   0.00    |   5980.00 |   0.00
|   56789012    |   USER    |   2015-08-06  |   NULL    |   0.00    |   0.00    |   0.00
|   56789012    |   NONUSR  |   2015-08-06  |   NULL    |   0.00    |   400.00  |   0.00
|   35789651    |   USER    |   2015-12-23  |   NULL    |   0.00    |   1990.00 |   0.00
|   35789651    |   NONUSR  |   2015-12-23  |   NULL    |   0.00    |   3980.00 |   0.00
|   25879460    |   USER    |   2016-01-01  |   NULL    |   0.00    |   2000.00 |   0.00
|   25879460    |   NONUSR  |   2016-01-11  |   NULL    |   0.00    |   4000.00 |   0.00

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

|   CUSTUM_ID   |   DATE_RATE   |   STATU   |   ORIG_P  |   PRICEU  |   PRICENU |   DISC
---------------------------------------------------------------------------------------------
|   12345678    |   2015-05-19  |   NULL    |   0.00    |   2990.00 |   5980.00 |   0.00
|   56789012    |   2015-08-06  |   NULL    |   0.00    |   0.00    |   400.00  |   0.00
|   35789651    |   2015-12-23  |   NULL    |   0.00    |   1990.00 |   3980.00 |   0.00
|   25879460    |   2016-01-01  |   NULL    |   0.00    |   2000.00 |   4000.00 |   0.00

Я читал, и лучшее предложение было использовать FULL OUTER JOIN но до сих пор я получаю тот же вход, что и при использовании внутреннего соединения. Как я могу изменить запрос для отображения данных, как мне это нужно?

2 ответа

Решение

Вы можете сделать это с помощью условного агрегирования:

SELECT P.CUSTUM_ID, M.DATE_RATE, PP.DISC,
       MAX(CASE WHEN P.STATUS = 'USER' THEN PP.PRICE_USR END) AS PRICEU,
       MAX(CASE WHEN P.STATUS = 'NONUSR' THEN PP.PRICE_USR END) AS PRICENU 
FROM MBR_INFO AS M
INNER JOIN PARENT_INFO AS P
  on M.CUSTUM_ID = P.CUSTUM_ID
INNER JOIN PRICE_PARENT PP
  on P.CUSTUM_ID = PP.CUSTUM_ID
WHERE M.DATE_RATE > (getDate())
  and P.USER_FLAG = 'Y'
GROUP BY P.CUSTUM_ID, M.DATE, PP.DISC
ORDER BY M.DATE_RATE;

Если есть отдельные M.DATE Значения для каждой группы, то вы можете удалить M.DATE поле из GROUP BY пункт и включить поле в SELECT используя агрегатную функцию, например MIN(M.DATE),

Вы можете присоединиться к столу с самим собой.

Это только часть, чтобы показать вам, как конвертировать две строки в одну. Вам все еще нужны другие таблицы.

 SELECT P_USER.CUSTUM_ID, 
        P_USER.STATUS,    -- I know is user
        P_NOUSER.STATUS   -- I know is not user
 FROM PARENT_INFO as P_USER
 JOIN PARENT_INFO as P_NOUSER
   ON P_USER.CUSTUM_ID = P_NOUSER.CUSTUM_ID
WHERE
     P_USER.STATUS = 'USER'
 AND P_NOUSER.STATUS = 'NONUSR'
Другие вопросы по тегам