MYSQL-запрос для объединения данных двух таблиц с общим внешним ключом из третьей таблицы - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь объединить данные из двух таблиц продаж и покупок в одну таблицу.Обе таблицы «Продажи и покупки» совместно используют внешний ключ из хранилища третьей таблицы.

Каков наилучший способ построения запроса для получения результатов точно так же, как в таблицах результатов, предпочтительно (если это возможно) без использования подзапроса, так какМне нужно создать представление результата запроса, а MYSQL не позволяет создавать представление запроса с использованием подзапроса.

Я попытался выбрать с помощью объединения, но не получил ожидаемый результат.

базовых таблиц и результатов запроса

Ответы [ 2 ]

0 голосов
/ 15 января 2012

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

( SELECT st.store_name, s.month,
          COALESCE( s.salestotal, 0 ) as salestotal, 
          COALESCE( p.purchasetotal, 0 ) as purchasetotal
FROM 
  store st
  JOIN
    ( SELECT store_id, SUM(sales) as salestotal, 
             DATE_FORMAT( date, '%b %Y' ) as month
      FROM sales
      GROUP BY store_id, month ) s
  ON st.store_id = s.store_id
  LEFT JOIN
    ( SELECT store_id, SUM(purchase) as purchasetotal, 
      DATE_FORMAT( date, '%b %Y' ) as month
      FROM purchase
      GROUP BY store_id, month ) p
  ON p.store_id = s.store_id AND p.month = s.month )
UNION
( SELECT st.store_name, p.month,
          COALESCE( s.salestotal, 0 ) as salestotal, 
          COALESCE( p.purchasetotal, 0 ) as purchasetotal
FROM
  store st
JOIN
  ( SELECT store_id, SUM(purchase) as purchasetotal, 
           DATE_FORMAT( date, '%b %Y' ) as month
    FROM purchase
    GROUP BY store_id, month ) p
ON st.store_id = p.store_id
LEFT JOIN 
  ( SELECT store_id, SUM(sales) as salestotal, 
    DATE_FORMAT( date, '%b %Y' ) as month
    FROM sales
    GROUP BY store_id, month ) s
ON
  p.store_id = s.store_id AND p.month = s.month )
ORDER BY month, store_name
0 голосов
/ 15 января 2012

Следующий запрос (не проверенный) должен дать нужный набор результатов:

SELECT store_name AS store, MONTH(sales.date) AS month, SUM(sales.sales) AS sales, SUM(purchase.purchase) AS purchase
FROM store 
JOIN sales ON store.store_id = sales.store_id
JOIN purchase ON store.store_id = purchase.store_id
GROUP BY store.store_id,MONTH(sales.date), MONTH(purchase.date)
...