LEFT JOIN users AS B ON A.user_id = B.id;
в таблице cash_operations есть 2 разных id пользователя, но запрос возвращает только одного
И это происходит только тогда когда есть строка SUM(A.subtotal) AS subtotal в селекте.
Как получить все записи?
попробовать убрать SUM()? наверно поэтому у вас группируется одинаковые записи
SELECT B.full_name, DATE(created_at) as created_at, SUM(CASE WHEN A.type = "cash" THEN subtotal ELSE 0 END) as cash, SUM(CASE WHEN A.type = "paycard" THEN subtotal ELSE 0 END) as paycard, SUM(CASE WHEN A.type = "paysys" THEN subtotal ELSE 0 END) as paysys, SUM(CASE WHEN A.type = "self" THEN subtotal ELSE 0 END) as self, SUM(CASE WHEN A.type = "debt" THEN subtotal ELSE 0 END) as debt, SUM(subtotal) as subtotal FROM cash_operations AS A LEFT JOIN users as B ON B.id=A.user_id WHERE A.created_at > DATE("now","-1 day") Я хочу вывести итоговое значение продаж у пользователей по типу продажи (cash_operations.type)
структура таблиц
Видимо, дело в null'ах. Я бы начал с замены sum(x) на sum(case when x is null then 0 else x end).
Дело в том что там нету null значений нигде
Точно? А почему тогда left join а не inner?
null возможно будут, но в данных записях нету
Я пробовал сгруппировать по user_id, но расчеты неправильно выводятся
А если в таблицу Data еще и типы (cash, mastercard, paypal) добавить и суммировать по типу?
У тебя запрос неверный, должна быть фраза GROUP BY
Это не оконные, это агрегирующие функции... Но совет полезный
Учи SQL, блин! Все поля из списка вывода запроса, не находящиеся под агрегирующими фунциями , должны быть указаны во фразе GROUP BY. На сервере MySQL есть параметр, который включает жёсткое соблюдение правил ANSI SQL — включи его, и такие запросы автоматом будут признаваться у тебя ошибочными (какие они и есть на самом деле), и тебе не удастся послать неверный запрос.
Группировка помогла...
немного раннее был вопрос как можно взять не нулл поля при группировке вопрос удалили но стало интересно как это можно реализовать как примерно не подскажешь?
Во-первых, почти все агрегаты игнорируют NULL. И это просто не нужно. Во-вторых, ты можешь явно написать выражение, где будешь заменять NULL на нужные тебе значения (ну, вдруг например тебе надо суммировать NULL как 1цу, или учитывать NULL в средних значениях как-то)
можно where до или having после в хороших СУРБД есть ещё и rollup cube GROUPING SETS часто много экономят на самоджойнах
Я пробовал группировать, но забыл что фильтровал записи по дате и подумал что неправильно все выводится. Спасибо всем за помощь!
https://sqlize.online/sql/psql14/836823aac5e396194b55fcbc6f9b0d99/ вот типо здесь надо вывести если возможно не null значения по group by username как примерно это можно?
оконные функции - это в какой СУБД?
Вообще, они вроде стандартные, в любой есть (или нет)
Обсуждают сегодня