Есть ли способ использовать SQL Join в Oracle? - PullRequest
0 голосов
/ 29 января 2019

У меня есть запрос, который я использовал ранее в MS SQL и хотел бы использовать в Oracle.Однако он возвращает пропущенное выражение.

Мне нужны данные из той же таблицы, но с другим параметром, который нельзя объединить в одном запросе.

TABLE TTT

DATE        LIC      ITEM   QTY  SU
20-01-2019  L991234  P0042   20  S002201
20-01-2019  L991234  P0042   40  S002202
20-01-2019  L991234  P0042   60  S002203
20-01-2019  L991234  P0042   80  S002204
20-01-2019  L991234  P0042  100  S002205
21-01-2019  L991245  P0069   30  S003101
21-01-2019  L991245  P0069   60  S003102
21-01-2019  L991245  P0069   90  S003103
21-01-2019  L991245  P0069  120  S003104
22-01-2019  L991256  P0042   20  S004301
22-01-2019  L991256  P0042   40  S004302
22-01-2019  L991256  P0042   60  S004303
22-01-2019  L991256  P0042   80  S004304
23-01-2019  L991264  P0069   30  S007501
23-01-2019  L991264  P0069   60  S007502
23-01-2019  L991271  P0042   20  S008801
23-01-2019  L991271  P0042   40  S008802

Запрос:

SELECT TA.ITEM, TA.CNT, TB.CNT
FROM (
SELECT  1 typ, DISTINCT TTT.ITEM, TTT.NO, COUNT(DISTINCT TTT.LIC)
    FROM TTT
    WHERE TTT.TYPE = '6' AND TTT.ITEM = 'H01234'
    GROUP BY   TTT.ITEM,TTT.LIC
    ORDER BY TTT.ITEM, TTT.NO
) TA
INNER JOIN
  (
SELECT  2 typ, DISTINCT TTT.ITEM, COUNT(DISTINCT TTT.SU)
   FROM TTT
        WHERE TTT.TYPE = '6' AND TTT.ITEM = = 'H01234'
        GROUP BY   TTT.ITEM, TTT.SU
        ORDER BY TTT.ITEM
) TB ON TA.ITEM = TB.ITEM
ORDER BY TA.ITEM

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

TA.ITEM  TA.CNT  TB.CNT
P0042         3      11
P0069         2       6

Ответы [ 3 ]

0 голосов
/ 29 января 2019

может означать, что предложение объединения имеет значение ON TA.ITEM = TB.ITEM, а не ON. TA.FROM_ITEM = TB.FROM_ITEM

    SELECT TA.ITEM, TA.CNT, TB.CNT
    FROM (
        SELECT  1 typ, DISTINCT TTT.ITEM, TTT.NO, COUNT(DISTINCT TTT.LIC)
            FROM TTT 
            WHERE TTT.TYPE = '6' AND TTT.ITEM = 'H01234' 
            GROUP BY   TTT.ITEM,TTT.LIC
            ORDER BY TTT.ITEM, TTT.NO
    ) TA
    INNER JOIN  ( 
        SELECT  2 typ, DISTINCT TTT.ITEM, COUNT(DISTINCT TTT.SU)
           FROM TTT 
                WHERE TTT.TYPE = '6' AND TTT.ITEM = = 'H01234'   
                GROUP BY   TTT.ITEM, TTT.SU
                ORDER BY TTT.ITEM
    ) TB ON TA.ITEM = TB.ITEM
    ORDER BY TA.ITEM
0 голосов
/ 29 января 2019

Вы можете сделать это намного проще, без объединений и союзов:

dbfiddle demo

select item, count(distinct lic) cnt1, count(distinct su) cnt2
  from ttt 
  group by item

Результат:

ITEM        CNT1       CNT2
----- ---------- ----------
P0042          3         11
P0069          2          6
0 голосов
/ 29 января 2019

DISTINCT должно следовать SELECT;у вас есть два последовательных = s

После того, как это исправлено, запрос выглядит нормально (но я не знаю, возвращает ли он нужные данные):

  SELECT TA.ITEM, TA.CNT, TB.CNT
    FROM (  SELECT DISTINCT 1 typ,                        --> here
                            TTT.ITEM,
                            TTT.NO,
                            COUNT (DISTINCT TTT.LIC)
              FROM TTT
             WHERE     TTT.TYPE = '6'
                   AND TTT.ITEM = 'H01234'
          GROUP BY TTT.ITEM, TTT.LIC
          ORDER BY TTT.ITEM, TTT.NO) TA
         INNER JOIN (  SELECT DISTINCT 2 typ,            --> here
                              TTT.ITEM, COUNT (DISTINCT TTT.SU)
                         FROM TTT
                        WHERE     TTT.TYPE = '6'
                              AND TTT.ITEM = 'H01234'    --> here
                     GROUP BY TTT.ITEM, TTT.SU
                     ORDER BY TTT.ITEM) TB
            ON TA.FROM_ITEM = TB.FROM_ITEM
ORDER BY TA.ITEM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...