"INNER JOIN" и "LEFT JOIN" с "GROUP BY" - PullRequest
0 голосов
/ 28 марта 2019

Мои таблицы выглядят так:

sales
----------------------------------------------------------
id  ordernumber             quantity  category_id    price
1   402-9182243-8008368     1         3              22.95
2   406-3666671-8627555     2         3               6.95
3   303-1935495-5532309     1         1               7.95
4   171-5799800-1198702     1         2             159.95
5   403-2398078-4901169     2         2              18.95

category
--------------
id  name
1   bikes
2   shoes
3   planes

returns
--------------
id  ordernumber          quantity   costs
1   402-9182243-8008368  1          22.95   
2   402-9182243-8008368              5.95   // return shipping fee

А вот мой запрос

    SELECT c.name,
           SUM(v.quantity) AS sold,               # wrong
           SUM(s.quantity * s.price) AS turnover, # wrong
           SUM(r.costs) AS returncosts,
      FROM sales AS s
INNER JOIN categories AS c ON c.id = s.category_id  
 LEFT JOIN returns AS r ON r.ordernumber = s.ordernumber 
  GROUP BY c.name

У меня есть несколько внутренних объединений с агрегатными функциями.Но мне также нужно «вернуться» с «Left Join» (я думаю).А с левым соединением мои агрегатные функции больше не работают.Left Join добавляет дополнительные строки.Дополнительные данные, для sum ().

Мне нужен один запрос, поэтому каждый столбец можно отсортировать позже.Я был бы рад любой помощи.С наилучшими пожеланиями

Ответы [ 2 ]

4 голосов
/ 28 марта 2019

Это полукартово произведение, потому что порядковый номер не уникален в таблице возвратов.

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

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

Если предположить, что номер заказа уникален в таблице продаж, то примерно так:

SELECT c.name
     , SUM(s.quantity)                  AS sold
     , SUM(s.quantity * s.price)        AS turnover
     , SUM(r.returncosts)               AS returncosts
  FROM sales s
  JOIN categories c
    ON c.id = s.category_id
  LEFT 
  JOIN ( SELECT t.ordernumber 
              , SUM(t.costs) AS returncosts
           FROM returns t
          GROUP
             BY t.ordernumber
       ) r 
    ON r.ordernumber = s.ordernumber
 GROUP
    BY c.name
1 голос
/ 28 марта 2019

Вы можете суммировать количество отдельно от LEFT JOIN в sub query следующим образом:

SELECT t1.name, t1.sold, t1.turnover, SUM(r.costs) AS returncosts  
FROM(
   SELECT c.name,
       SUM(s.quantity) AS sold,                
       SUM(s.quantity * s.price) AS turnover 
  FROM sales AS s
 INNER JOIN categories AS c ON c.id = s.category_id 
 GROUP BY name
)  t1
LEFT JOIN returns AS r ON r.ordernumber = s.ordernumber 
GROUP BY t1.name, t1.sold, t1.turnover
...