Как совместить сложный SQL-запрос и выборку из нескольких таблиц?

Программа должна рассчитывать сколько пользователь потратил за месяц. Имеется 2 таблицы. табл1 - SmetaOut: cec834b11b7948289cc56bf0d776715d.PNG
табл2 - Outlaynames
10b68a07a45346759e29b9db37c324d8.PNG
Таблица1 содержит:
cash - сумма, потраченная
data - дата, когда потратил
IdCategories - внешний ключ на табл2
Таблица2 содержит:
id - ключ записи
name - наим категории
Суть вопроса: из этих двух таблиц необходимо сделать выборку ненулевых затрат за текущий месяц (записи с одинаковым внешним IdCategories суммируются ). Но проссумировав, я хочу в одном запросе вместо IdCategories получить соотвествующий name. Додумалась только до двух отдельных запросов.
1)
SELECT OutlayNames.name, SmetaOut.cash
FROM SmetaOut, OutlayNames
WHERE ( (month(SmetaOut.date) = month(GETDATE())) and (SmetaOut.cash<>0) and (OutlayNames.Id=SmetaOut.IdCategories))
в результате:a423c2ad6fe7425a9a22d83a6e65654e.PNG

2)
SELECT SUM(SmetaOut.cash), SmetaOut.IdCategories
FROM SmetaOut
WHERE ( (month(SmetaOut.date) = month(GETDATE())) and (SmetaOut.cash<>0))
GROUP BY SmetaOut.IdCategories
результат:fe112bb861a64dda841dd3815cef74bb.PNG

Вопрос: как их соединить в один?
(чтобы было
налоги 25
еда 75)
Заранее искренне благодарю)
  • Вопрос задан
  • 1684 просмотра
Решения вопроса 1
@nozzy
Symfony, Laravel, SQL
У вас в первом запросе таблицы уже соединены, нужно только добавить sum и group by:
SELECT OutlayNames.name, SmetaOut.IdCategories, SUM(SmetaOut.cash)
FROM SmetaOut, OutlayNames 
WHERE ( (month(SmetaOut.date) = month(GETDATE())) and (SmetaOut.cash<>0) and (OutlayNames.Id=SmetaOut.IdCategories))
GROUP BY OutlayNames.name, SmetaOut.IdCategories
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
загуглите INNER JOIN
Ответ написан
Комментировать
@Noxy
увлекаюсь SQL
SELECT O.Id AS IdCategories, O.name, SUM(S.cash) AS Summ
FROM OutlayNames O
    LEFT JOIN SmetaOut S ON (O.Id=S.IdCategories)
WHERE ( (month(S.date) = month(GETDATE())) and (S.cash<>0))
GROUP BY O.Id, O.name
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы