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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Помогите, пожалуйста решить следующую проблему.
Есть три таблицы:
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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2014, 23:26
Ответы с готовыми решениями:

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

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

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

3
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
12.06.2014, 00:39
Лучший ответ Сообщение было отмечено 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  [ТС]
grgdvo, большое спасибо! если можете объясните пожалуйста что такое OVER и PARTITION BY
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
18.06.2014, 16:34
Вся эта конструкция называется "оконной" функцией (window function).
Позволяет выполнять действия (применять различные агрегатные функции) над некоторым подмножеством строк основной выборки запроса. Разбиение на поднможества строк выполняется по значениям полей, указанных в partition by и опционально отсортированных через order by.
Более подробно написано здесь.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.06.2014, 16:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru