![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
sneer |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
есть простенькая структура бд.
Продаём товар. Основная таблица 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, 00:00 |
||||
|
|||||
sneer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
мне тут немножко поправили заголовок время там чуток не правильно а так суть верна. найти сумму по каждой дате из второго запроса. Сумма находится первым запросом.Фокусы с датой можно пока убрать вообще.
updt похоже суть вопроса правильно применить IN и JOIN вот только как... Это сообщение отредактировал(а) sneer - 29.1.2009, 05:05 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
т.е. чтоб и запись "дата + сумма за дату" и запись "дата + количество + товар + время" были в одной таблице-результате? Вообще для такого используется не join(т.е. запись с суммой будет одна, а вот записей с соответствующими дате продажами может быть неопределенное и неограниченное количество), а union. но я бы хотел с тобой поспорить насчет необходимости столь разнородные по структуре(количеству полей) и по значению пихать в один запрос. Если тебе необходимо сформировать отчет(для печати или подобного чего-то), может суммировать не средствами СУБД, а на клиенте уже? |
|||
|
||||
sneer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
я об этом думал но отчёт именно в такой форме да и просто интересно как склеит в кучу эти два запроса. Ща по union почитаю ещё раз доки. Как то слабо вижу решение в его использовании. Мне почему-то кажеться что sql будет быстрее нежели либой язык который будет получать запрос обрабатывать а потом по одному опять тыкать запрос. Скорость там не критична но всегда нужно стараться сделать лучше.
Тут впринципе как правильно скармливать даты по очереди самому нижнему join который уже есть ведь запрос рабочий осталось только сделать так что бы дат было несколько и он выводил их по очереди. Это сообщение отредактировал(а) sneer - 29.1.2009, 20:50 |
|||
|
||||
sneer |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Упростил всё что бы нагляднее.
три таблицы 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 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Счастье было сильно ближэ (синтаксис не проверял, но идея должны быть такой):
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 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
большое спасибо но второй запрос подходит только для упрощённого условия. Начальному условию которое на старте оно не подходит. Там дополнительные условия по нахождению "завтра" и суммированию его вместе. А за первый огромное человеческое спасибо
|
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Честно говоря, как-то недопонял, с чем проблемы в этом запросе. Но одна из вещей, отличие в которых могут быть непонятны:
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 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
это явно компактнее моего угрёбища не могли бы вы разьяснить что вы делаете в новом для меня вызове COALESCE я понимаю только примерно
у меня всё это закончилось вот таким чудовищем (((
Вопрос перерос из того как делать в как сделать правильно Это сообщение отредактировал(а) sneer - 5.2.2009, 03:15 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |