Коррелированный подзапрос mysql - PullRequest
2 голосов
/ 12 февраля 2012

так у меня есть таблица с продуктами

Product ID | Product Name
===========+===============
1          | Tissues
2          | Glass

У меня есть таблица с продажами

Sale ID    | Product ID | Quantity | Price
===========+============+==========+=============
1          | 1          | 1        | 55
2          | 2          | 1        | 60

и у меня есть таблица покупок

Batch ID | Total Value | Quantity | Product ID
=========+=============+==========+==================
1        | 100         | 100      | 1
2        | 10          | 50       | 2
3        | 1           | 1        | 2

Поэтому я пытаюсь рассчитать прибыль на основе средней стоимости, используя запрос

SELECT tblsale.product_id, 
       tblproduct.product_name, 
       SUM(tblsale.`quantity`) qty,
       SUM(tblsale.`Price`*tblsale.`quantity`) sales, 
       (SELECT sum(total_value) / sum(quantity) VWAP 
        FROM tblpurchases 
        WHERE product_id = tblsale.product_id) average_price, 
       (average_price * qty) cost, 
       (sales-cost) profit 
FROM   tblsale, tblproduct 
WHERE tblproduct.product_id = tblsale.`product_id` 
GROUP by tblsale.`product_id`

Но я не могу заставить его работать. Я получаю «среднюю цену» - неизвестный столбец, как бы я правильно структурировал запрос

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

SQL не поддерживает ссылки на псевдоним столбца в том же предложении SELECT - поэтому ваш столбец average_price возвращает ошибку 1054.Вы должны либо выполнить любую нужную вам операцию в подвыборке, производном табличном / встроенном представлении, либо при необходимости повторно использовать основную логику.Вот пример повторного использования логики:

   SELECT prod.product_id, 
          prod.product_name, 
          SUM(s.quantity) qty,
          SUM(s.Price * s.quantity) sales, 
          SUM(pur.total_value) / SUM(pur.quantity) average_price, 
          SUM(pur.total_value) / SUM(pur.quantity) * SUM(s.quantity) cost, 
          SUM(s.Price * s.quantity) - (SUM(pur.total_value) / SUM(pur.quantity) * SUM(s.quantity)) profit 
     FROM tblproduct prod 
LEFT JOIN tblsale s ON prod.product_id = s.product_id
LEFT JOIN tblpurchases pur ON pur.product_id = prod.product_id
 GROUP BY s.product_id

В моем запросе используется синтаксис ANSI-92 JOIN, который я рекомендую использовать вместо синтаксиса ANSI-89, используемого вашим запросом.См. этот вопрос для более подробной информации .

0 голосов
/ 12 февраля 2012

Как вы попали на этот запрос? Он полностью выключен .. При написании запроса начните с малого, а затем соберите его. Теперь ваш запрос представляет собой полный беспорядок, и он не близок к действительному, в нем есть случайные скобки.

Чтобы начать, используйте отступ, чтобы сделать ваш запрос читабельным

    SELECT p.product_id, p.product_name
         , SUM(s.quantity) number_of_sales
         , SUM(s.price) total_profit
         , SUM(pu.quantity) purchase_quantity
         , SUM(pu.value) purchase_value
         , (SUM(pu.quantity) - SUM(s.quantity)) number_in_stock
         , (SUM(s.price) - SUM(pu.value)) profit
         , (SUM(pu.value) / SUM(pu.quantity)) avarage_purchase_price
      FROM product p
 LEFT JOIN sales s ON s.product_id = p.product_id
 LEFT JOIN purchase pu ON pu.product_id = p.product_id         
  GROUP BY s.product_id, pu.product_id

" Но я не могу заставить его работать. Я получаю 'среднюю цену' - неизвестный столбец, как бы я правильно структурировал запрос "

Что такое «средняя цена»? Как бы вы хотели рассчитать среднюю цену? И то же самое для «средней стоимости»

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