Объедините все ваши запросы, которые уже работают (и имеют общую тему месяца / года):
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