Как найти прибыль для категории

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

У меня есть 3 таблицы, которые дают мне информацию:

ПРОДАЖИ(salesid,productid,количество,цена)

salesid  productid   Quantity Price
11001    13001       4        5
11002    13002       6        10
11003    13003       5        16
.
.
11012    13012       7        15

ВОЗВРАТ(Salesid,productid,дата,количество,цена)

salesid  productid   Quantity Price
11003    13003       1        16
11007    13007       3        12
11008    13008       3        8

ЗАКУПКА(ИД закупки,ИД продукта,количество,цена)

procurementid  productid   Quantity Price
100001         13001       10       2
100002         13002       10       2
.
. 
100012         13012       10       2

product_category (идентификатор категории, категория)

categoryid  category
1           Gold
2           Silver
.
5           Platin

продукт(Productid,categoryid)

Productid  categoryid
13001      1
13002      3
.
.
13010      5

Прибыль дается от этого вида:

Profit=Quantity*Price(Sell)-Quantity*Price(Return)-Quantity*Price(Procurement)

А теперь вот проблема .. Я пришел к этому до сих пор

SELECT categoryid,
       category,
       (coalesce(a.rev,0)- coalesce(b.ret,0),
                           coalesce(c.cost,0)) AS profit
FROM product category AS g
    JOIN product AS h ON g.categoryid = h.categoryid
    JOIN
      (SELECT categoryid,
              sum(quantity*price) AS rev
       FROM sales AS a,
            product AS b
       WHERE a.productid = b.productid
       GROUP BY categoryid) a
    LEFT OUTER JOIN
      (SELECT cartegoryid,
              sum(quantity*price) AS ret
       FROM RETURN AS a ,
                      product AS b
       WHERE a.productid = b.productid
       GROUP BY categoryid) b ON a.categoryid = b.categoryid
    LEFT OUTER JOIN
      (SELECT categoryid,
              sum(quantity*price) AS cost
       FROM procurement AS a,
            product AS b
       WHERE a.productid = b.productid
       GROUP BY categoryid) c ON a.categoryid = c.categoryid ,
    product AS d,
    procurement AS e
WHERE MONTH(f.date) = MONTH(e.date)
  AND YEAR(date) = 2013 

[извините за выравнивание, я новичок на сайте, не знаю, как правильно копировать и вставлять код (: D)] когда я это делаю, он приходит в состояние, подобное

categoryid  category  profit
1           Gold      -100
2           Silver    -100
.
5           Platin    -100

не знаю, в чем проблема... я сделал много изменений и переключателей, но ничего не вышло... любое предложение было бы очень полезно. Заранее спасибо


person user2432398    schedule 02.06.2013    source источник


Ответы (1)


Сначала кажется, что в вашей формуле прибыли есть лишняя запятая. это

(coalesce(a.rev,0) - coalesce(b.ret,0),coalesce(c.cost,0)) as profit

должно быть это

coalesce(a.rev,0) - coalesce(b.ret,0) - coalesce(c.cost,0) AS profit

Еще несколько проблем с этим запросом

  • Прямо перед предложением where, после присоединения к подзапросу стоимости, вы добавляете таблицы продуктов и закупок, но не присоединяете их. Это приведет к декартовому соединению, которое отбросит ваши результаты.
  • В предложении where вы не указываете, какое поле даты таблиц вы хотите использовать. AND YEAR(date) = 2013 должно быть e.date или f.date. Это должно было дать вам ошибку, если вы попытаетесь запустить его.
  • WHERE MONTH(f.date) = MONTH(e.date) к какой таблице относится f.date? Вы не дали псевдоним f ни одной таблице.
  • Вы присоединяетесь к закупкам и используете его поле даты для фильтрации результатов по месяцам, но ни в одном из ваших подзапросов доходов, возвратов и затрат даты не учитываются. Это отбросит ваши результаты.
person Jerry    schedule 02.06.2013