Вам нужно объединить все 3 таблицы:
SELECT *
FROM
companies c
INNER JOIN stores s on s.company_id = c.id
INNER JOIN invoices i ON i.store_id = s.id
Это все ваши необработанные данные в подробном списке. Затем вы говорите, что хотите это только для определенной компании:
SELECT *
FROM
companies c
INNER JOIN stores s on s.company_id = c.id
INNER JOIN invoices i ON i.store_id = s.id
WHERE c.name = 'Acme Rubber Co'
Тогда вам нужны только суммы магазинов и счетов:
SELECT s.name, i.total
FROM
companies c
INNER JOIN stores s on s.company_id = c.id
INNER JOIN invoices i ON i.store_id = s.id
WHERE c.name = 'Acme Rubber Co'
Затем вы хотите установить строку, где каждая строка это один магазин и сумма всех счетов для этого магазина:
SELECT s.name, SUM(i.total)
FROM
companies c
INNER JOIN stores s on s.company_id = c.id
INNER JOIN invoices i ON i.store_id = s.id
WHERE c.name = 'Acme Rubber Co'
GROUP BY s.name
И, наконец, вы хотите, чтобы они были в порядке убывания, наибольшее общее количество сначала:
SELECT s.name as storename, SUM(i.total) as turnover
FROM
companies c
INNER JOIN stores s on s.company_id = c.id
INNER JOIN invoices i ON i.store_id = s.id
WHERE c.name = 'Acme Rubber Co'
GROUP BY s.name
ORDER BY turnover DESC
Порядок оценки в sql - ОТ (с объединениями), ГДЕ, ГРУППА BY, SELECT, ORDER BY, поэтому я использую разные имена, например, в порядке, по которому я делаю в группе. Концептуально ваш БД видит только имена вещей, выведенные непосредственно предыдущей операцией. Mysql на самом деле не слишком требователен, но некоторые db - вы не могли бы сказать GROUP BY storename
на sql сервере, потому что SELECT, который создает псевдоним хранилища, не был запущен во время выполнения группой
Примечание: я не был уверен в том, что вы искали в ГДЕ - вы начали с того, что сказали «оборачиваемость всех магазинов для определенной компании», и закончили тем, что «пытались получить обороты за период»
Если вам нужен период, используйте, например, WHERE somedatecolumn BETWEEN '2000-01-01' AND '2000-12-31'
(Между включительно) или WHERE somedatecolumn >= '2000-01-01' AND somedatecolumn < '2001-01-01'
(Хорошая схема, которую следует использовать, если в дате также указано время). Почти никогда не целесообразно вызывать функцию в столбце, с которым вы ведете поиск, ie не делать WHERE YEAR(somedatecolumn) = 2000
, потому что это отключает индексирование по столбцу и делает поиск очень медленным