Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 2
1

Сложный запрос с датами

10.06.2014, 23:26. Показов 2290. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Помогите, пожалуйста решить следующую проблему.
Есть три таблицы:
Income[id, Sdate, id_elem, amount] (приход деталей, содержит инфо о приходящих на склад деталях, из таблицы
Nomenclature, за определенную дату, в определенном количестве),

Outgo[id, Sdate, id_elem, amount] (расход деталей, содержит инфо о расходованных деталях, из таблицы
Nomenclature, за определенную дату, в определенном количестве),

Nomenclature[id, name_elem] (справочник деталей).

Необходимо выбрать наименование детали, дата расхода, когда расходованное количество превысило имеющееся количество деталей. Упорядочить по наименованию детали и дате расхода.
Пытаюсь делать так:
а) Создаем представление, которое возвращает разность между количеством каждой когда-либо израсходованной запчасти, и количеством этой же когда-либо пришедшей на склад запчасти:
SQL
1
2
3
4
5
6
7
8
CREATE VIEW OutMinusInc AS 
SELECT outgo.sdate, nomenclature.id, 
SUM(outgo.amount)-SUM(income.amount) AS delta 
FROM outgo JOIN nomenclature ON 
outgo.id_elem=nomenclature.id 
JOIN income ON 
income.id_elem=nomenclature.id 
GROUP BY outgo.sdate, nomenclature.id;
b) Выводим название запчасти и дату расхода, учитывая, что разность, возвращаемая представлением OutMinusInc, должна быть больше нуля:
SQL
1
2
3
4
5
6
7
8
9
10
SELECT name_elem, outgo.sdate 
FROM outgo JOIN nomenclature ON 
outgo.id_elem=nomenclature.id 
JOIN income ON 
income.id_elem=nomenclature.id 
JOIN OutMinusInc ON 
nomenclature.id=OutMinusInc.id 
WHERE delta>0
GROUP BY outgo.sdate,name_elem 
ORDER BY name_elem, outgo.sdate;
Это работает не верно. Из за того, что происходит группировка по датам (в пункте а), получается неверный результат. Без группировки по дате запрос не работает. Как избавиться от группировки и получить верный результат?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2014, 23:26
Ответы с готовыми решениями:

Сложный запрос
Всем привет! Подскажите пожалуйста, как реализовать следующее. В базе есть перечень таблиц, в...

сложный запрос
есть 2 таблицы: в таблице contract в поле ref_prize находятся значения id из таблицы prize. есть...

сложный запрос в postgre
Здравствуйте. Помогите пожалуйста составить SQL запрос для POSTGRE. Есть таблицы Table ds id ...

Сложный SQL запрос
Добрый день. Устройство присылает сигналы в три колонки T, H, P. При первом запуске приходят все...

3
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
12.06.2014, 00:39 2
Лучший ответ Сообщение было отмечено terrenus как решение

Решение

Алгоритм может быть такой:
1. Создать объединение двух таблица прихода и расхода; расход взять с минусом

SQL
1
2
3
4
CREATE VIEW transfer AS
SELECT id, Sdate, id_elem, amount FROM income
UNION ALL
SELECT id, Sdate, id_elem, -amount FROM outgo;
2. Посчитать сумму для amount

SQL
1
2
3
4
5
CREATE VIEW transfer2 AS
SELECT
t.*,
SUM(amount) OVER (PARTITION BY id_elem ORDER BY sdate) AS ostatok
FROM transfer t
3. Когда ostatok отрицательный - это и должны быть искомые записи

SQL
1
2
3
4
SELECT n.name_elem, MIN(sdate)
FROM transfer2 t2, nomenclature n
WHERE t2.id_elem=n.id AND ostatok < 0
GROUP BY name_elem;
Проверьте! Писал на память, мог и накосячить.
1
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 2
17.06.2014, 16:08  [ТС] 3
grgdvo, большое спасибо! если можете объясните пожалуйста что такое OVER и PARTITION BY
0
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
18.06.2014, 16:34 4
Вся эта конструкция называется "оконной" функцией (window function).
Позволяет выполнять действия (применять различные агрегатные функции) над некоторым подмножеством строк основной выборки запроса. Разбиение на поднможества строк выполняется по значениям полей, указанных в partition by и опционально отсортированных через order by.
Более подробно написано здесь.
1
18.06.2014, 16:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2014, 16:34
Помогаю со студенческими работами здесь

Сложный SQL запрос
Добрый день. Подскажите, пожалуйста, как исправить SQL запрос, чтобы получить данные указанные на...

Сложный запрос из одной таблицы с предварительной обработкой данных
Ребята не очень силен в запросах и токо начал осваивать постгри. есть таблица структура: camid-...

Сложный запрос
Помогите составить запрос который вернет N товаров принесшых максимальную прибыль(разница мжду...

Сложный запрос
SELECT * FROM facts WHERE DATE(date) BETWEEN date1 AND date2 Использую вот такой запрос ,но помимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru