Получить оборот, доход, общие расходы из моей базы данных и сгруппировать их по годам - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 4 таблицы:

Products - to record products
spending - to record expenses
directv  - to record subscription payments to TV channels
sales    - to record sales

Продукты имеют 4 столбца: idProd это первичный ключ

+--------+-----------+--------------+-------------+
| idProd | nameProd  | sellingPrice | buyingPrice |
+--------+-----------+--------------+-------------+
|      1 | Iphone 8  |          500 |         400 |
|      2 | Samsung 2 |          600 |         400 |
+--------+-----------+--------------+-------------+

Расходы - 3 столбца и idSpd - первичный ключ

+-------+--------+------------+
| idSpd | amount | dateSpd    |
+-------+--------+------------+
|     1 |   1000 | 2018-11-01 |
|     2 |   1000 | 2018-11-01 |
|     3 |   1000 | 2018-10-01 |
|     4 |   4000 | 2018-10-01 |
+-------+--------+------------+

Продажи - 5 столбцов с idSale в качестве первичного ключа и idProd, чтобы связать его с таблицей продукта

+--------+--------+--------------+----------+------------+
| idSale | idProd | sellingPrice | quantity | dateSale   |
+--------+--------+--------------+----------+------------+
|      1 |      1 |          700 |        2 | 2018-11-01 |
|      2 |      1 |          700 |        5 | 2018-11-15 |
|      3 |      2 |          800 |        2 | 2018-11-16 |
+--------+--------+--------------+----------+------------+

и directv:

+-------+-----------------+-------+------------+
| idDtv | brand           | price | dateDtv    |
+-------+-----------------+-------+------------+
|     1 | channel decoder |   150 | 2018-11-09 |
+-------+-----------------+-------+------------+

и я хочу получить, например:

income|gain of product  |  turnover | Spending | DirecTv | month | year
1000  |     400         | 5500      | 3000     | 50      | 10     |2018
500   |     200         |  1000     | 2000     | 0       | 11     |2018

мои запросы:

--for directv
select sum(dv.price) , month(dv.dateDtv), year(dv.dateDtv) from directv dv GROUP by year(dv.dateDtv) , month(dv.dateDtv) 

--for turnover
select sum(sl.quantity*sl.sellingPrice) , month(sl.dateSale) , year(sl.dateSale) from sales sl GROUP by year(sl.dateSale) , month(sl.dateSale)

--for spending
select sum(spd.amount) , month(spd.dateSpd) , year(spd.dateSpd) from spending spd GROUP by year(spd.dateSpd) , month(spd.dateSpd) 

--for gain of product
SELECT sum(s.quantity*(s.sellingPrice-p.buyingPrice)) from sales s JOIN products p on s.idProd = p.idProd GROUP by year(s.dateSale) , month(s.dateSale) 

и доход = прирост продукта + directv - расходы

Я хочу объединить все эти запросы и вычислить income. Вчера я попробовал без настольного продукта с @Gordon Linoff здесь все было в порядке, но я не смог объединиться с моим новым настольным продуктом сегодня.

1 Ответ

0 голосов
/ 05 ноября 2018

Объедините все ваши запросы, которые уже работают (и имеют общую тему месяца / года):

SELECT * 
FROM
  (select sum(dv.price) directv, month(dv.dateDtv) as mo, year(dv.dateDtv) as yr from directv dv GROUP by year(dv.dateDtv) , month(dv.dateDtv)) as directv
  INNER JOIN
  (select sum(sl.quantity*sl.sellingPrice) as turnover, month(sl.dateSale) as mo, year(sl.dateSale) as yr from sales sl GROUP by year(sl.dateSale) , month(sl.dateSale)) as turnover
  ON directv.mo = turnover.mo and directv.yr = turnover.yr

  INNER JOIN
  (select sum(spd.amount) as spending, month(spd.dateSpd) as mo, year(spd.dateSpd) as yr from spending spd GROUP by year(spd.dateSpd) , month(spd.dateSpd)) as spending
  ON directv.mo = spending.mo and directv.yr = spending.yr

  INNER JOIN
  (SELECT sum(s.quantity*(s.sellingPrice-p.buyingPrice)) as gain, year(s.dateSale) as yr, month(s.dateSale) as mo from sales s JOIN products p on s.idProd = p.idProd GROUP by year(s.dateSale) , month(s.dateSale) ) as gain
  ON directv.mo = gain.mo and directv.yr = gain.yr

Вот еще один способ написать то же самое:

WITH
  directv as (select sum(dv.price) directv, month(dv.dateDtv) as mo, year(dv.dateDtv) as yr from directv dv GROUP by year(dv.dateDtv) , month(dv.dateDtv)),
  turnover as (select sum(sl.quantity*sl.sellingPrice) as turnover, month(sl.dateSale) as mo, year(sl.dateSale) as yr from sales sl GROUP by year(sl.dateSale), month(sl.dateSale)),
  spending as (select sum(spd.amount) as spending, month(spd.dateSpd) as mo, year(spd.dateSpd) as yr from spending spd GROUP by year(spd.dateSpd) , month(spd.dateSpd)),
  gain as (SELECT sum(s.quantity*(s.sellingPrice-p.buyingPrice)) as gain, year(s.dateSale) as yr, month(s.dateSale) as mo from sales s JOIN products p on s.idProd = p.idProd GROUP by year(s.dateSale) , month(s.dateSale) )

SELECT * FROM
  directv
  INNER JOIN turnover ON directv.mo = turnover.mo and directv.yr = turnover.yr
  INNER JOIN spending ON directv.mo = spending.mo and directv.yr = spending.yr
  INNER JOIN ON directv.mo = gain.mo and directv.yr = gain.yr

Используйте тот, который вы предпочитаете;)

Теперь эти запросы просто ВЫБИРАЮТ * данные из всех соответствующих подзапросов - вам еще предстоит немного поработать, чтобы а) удалить множественные вхождения mo и yr и б) выполнить математические расчеты любые столбцы, например select gain.gain + directv.directv - spend.spend as income.. но это должно быть достаточно просто, если вы видите все данные в одной строке

Важно : Если какой-либо из этих запросов когда-либо не даст результатов в течение месяца, не используйте внутреннее объединение, так как все статистические данные за месяц исчезнут. Выберите запрос, у которого никогда не будет пропущенного месяца, и оставьте вместо него другие подзапросы

Если такого месяца никогда не будет, т. Е. Есть вероятность, что ЛЮБОЙ из этих запросов в один прекрасный день не даст результатов за месяц, а затем алгоритмически создаст другой список месяцев и оставит все присоединенные к нему подзапросы. Вот один такой вопрос, который касается того, как это сделать:

Как получить список месяцев между двумя датами в mysql

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