| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > PostgreSQL: суммировать от 12:00 до 11:59(сл. дня) |
| Автор: sneer 28.1.2009, 23:30 | ||||
| есть простенькая структура бд. Продаём товар. Основная таблица sold в которую вноситься ай-ди товара, дата_айди, кол-во проданного и время продажи есть такие тейблы date -(id,date) goods -(id,name,price_id) price - (id,opg,retail) // айди,оптовая и розничная цена sold - (id, goods_id, date_id,quantity, time ) //ай-ди, ай-ди товара, ай-ди даты, кол-во проданного и время есть ещё таблицы например склад из которого по тригеру отнимается занесённое в sold но эт здесь не важно. Суть такова. Нужна такая таблица. Число. Сумма всего проданного в деньгах. Я сделал это так для одного дня.
Мне нужно сделать так что бы даты отсюда
были в одной таблице с суммами по этой дате. По поводу тацев с временем и датами. Торговля идёт ночью )) до двенадцати и после двенадцати. А торговый день условно один. Как решение. Можно сделать функцией. Можно ли это сделать исключительно sql без отдельной функции? БД Postgresql 8.3 |
| Автор: sneer 29.1.2009, 02:30 |
| мне тут немножко поправили заголовок время там чуток не правильно а так суть верна. найти сумму по каждой дате из второго запроса. Сумма находится первым запросом.Фокусы с датой можно пока убрать вообще. updt похоже суть вопроса правильно применить IN и JOIN вот только как... |
| Автор: sneer 29.1.2009, 20:40 |
| я об этом думал но отчёт именно в такой форме да и просто интересно как склеит в кучу эти два запроса. Ща по union почитаю ещё раз доки. Как то слабо вижу решение в его использовании. Мне почему-то кажеться что sql будет быстрее нежели либой язык который будет получать запрос обрабатывать а потом по одному опять тыкать запрос. Скорость там не критична но всегда нужно стараться сделать лучше. Тут впринципе как правильно скармливать даты по очереди самому нижнему join который уже есть ведь запрос рабочий осталось только сделать так что бы дат было несколько и он выводил их по очереди. |
| Автор: sneer 30.1.2009, 01:11 | ||||||||||||
| Упростил всё что бы нагляднее. три таблицы date price sold sold имет ключи на две остальных. расматриваемый пример кол-во продаваемого всегда 1 для простоты. Вот дамп.
Итак. первый запрос для даты 1 select sum(t_price.price) as sum from (select price.price from testing.sold LEFT JOIN testing.price ON (price.id=sold.price) where sold.date=1) as t_price; получаем 88. делаем in и вставляем дату. получаем буэ select sold.date,sum(t_price.price) as sum from testing.sold,(select price.price from testing.sold LEFT JOIN testing.price ON (price.id=sold.price) where sold.date IN (select date.id from testing.date)) as t_price GROUP BY sold.date; date | sum ------+----- 2 | 693 3 | 693 1 | 924 (3 rows) А счастье было так близко. |
| Автор: tzirechnoy 30.1.2009, 02:04 |
| Счастье было сильно ближэ (синтаксис не проверял, но идея должны быть такой): select t_price.date, sum(t_price.price) as sum from (select price.price, sold.date from testing.sold LEFT JOIN testing.price ON (price.id=sold.price) where sold.date IN (select date.id from testing.date) as t_price GROUP BY t_price.date; И вообще, вложэнные запросы здесь полный overkill. SELECT date.id, sum(price.price*sold.quantity) FROM testing.date LEFT JOIN testing.sold ON sold.date=date.id LEFT JOIN testing.price ON sold.price=price.id GROUP BY date.id ORDER BY date.id |
| Автор: sneer 2.2.2009, 03:45 |
| большое спасибо но второй запрос подходит только для упрощённого условия. Начальному условию которое на старте оно не подходит. Там дополнительные условия по нахождению "завтра" и суммированию его вместе. А за первый огромное человеческое спасибо |
| Автор: tzirechnoy 4.2.2009, 12:58 |
| Честно говоря, как-то недопонял, с чем проблемы в этом запросе. Но одна из вещей, отличие в которых могут быть непонятны: SELECT (date.date + COALESCE(sold.time, '00:00:00'::time) - interval '4 hour')::date AS operden, sum(price.price*sold.quantity) FROM testing.date LEFT JOIN testing.sold ON sold.date=date.id LEFT JOIN testing.price ON sold.price=price.id GROUP BY operden ORDER BY operden |
| Автор: sneer 5.2.2009, 02:54 | ||
| это явно компактнее моего угрёбища не могли бы вы разьяснить что вы делаете в новом для меня вызове COALESCE я понимаю только примерно у меня всё это закончилось вот таким чудовищем (((
Вопрос перерос из того как делать в как сделать правильно |