powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос: приход - (минус) расход
5 сообщений из 5, страница 1 из 1
Запрос: приход - (минус) расход
    #33883748
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Есть две таблицы - приход и расход:


CREATE TABLE stock_receipt
(
receipt_id_pkey int4 NOT NULL DEFAULT nextval('stock_receipt_receipt_id_pkey_seq'::regclass),
document_id int4,
material_id int4,
material_description varchar(64),
quantity numeric(10,3),
price numeric(10,3),
CONSTRAINT stock_receipt_pkey PRIMARY KEY (receipt_id_pkey)
)

CREATE TABLE stock_receipt
(
receipt_id_pkey int4 NOT NULL DEFAULT nextval('stock_receipt_receipt_id_pkey_seq'::regclass),
document_id int4,
material_id int4,
material_description varchar(64),
quantity numeric(10,3),
price numeric(10,3),
CONSTRAINT stock_receipt_pkey PRIMARY KEY (receipt_id_pkey)
)

Помогите, пожалуйста, сделать запрос который покажет остатки материалов на складе (приход - расход).

Пробую вот так:


SELECT mf.name, (sum(sr.quantity) - sum (se.quantity)) AS remainder
FROM get_raw_materials() mf, stock_receipt sr, stock_expenditure se
WHERE mf.id = sr.material_id AND se.material_id = mf.id
GROUP BY mf.name

Но, к сожалению, когда материал не расходовался - для него ничего не выводится.

СПАСИБО!
...
Рейтинг: 0 / 0
Запрос: приход - (минус) расход
    #33883868
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT mf.name, 
    coalesce((SELECT sum(sr.quantity) FROM stock_receipt sr WHERE mf.id = sr.material_id),  0 ) - 
    coalesce((SELECT sum(se.quantity) FROM stock_expenditure se WHERE mf.id = se.material_id)
    AS remainder
FROM get_raw_materials() mf

По моему разумению join сразу на две таблицы не катит - %уйня получится с повторяющимися записями.
Что вместо подзапроса придумать - извини, пока не знаю.
Впрочем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT mf.name, sum(quantity) FROM (
SELECT material_id, sum(quantity) as quantity FROM stock_receipt sr GROUP BY material_id
UNION ALL
SELECT material_id, -sum(se.quantity) as quantity FROM stock_expenditure se GROUP BY material_id
) q
JOIN get_raw_materials() mf ON mf.id = q.material_id
GROUP BY q.material_id, mf.name
Ну и самый перевернутый вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT name, sum(quantity) FROM (
SELECT mf.name, sum(quantity) as quantity 
FROM stock_receipt sr JOIN get_raw_materials() mf ON mf.id = sr.material_id
GROUP BY mf.name
UNION ALL
SELECT mf.name, -sum(se.quantity) as quantity 
FROM stock_expenditure se JOIN get_raw_materials() mf ON mf.id = se.material_id
GROUP BY material_id
) q
GROUP BY name

Ну и гуру еще подскажут.
...
Рейтинг: 0 / 0
Запрос: приход - (минус) расход
    #33884299
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запрос: приход - (минус) расход
    #33884743
Igor Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!

Вторая таблица:

CREATE TABLE stock_expenditure
(
expenditure_id_pkey int4 NOT NULL DEFAULT nextval('stock_expenditure_expenditure_id_pkey_seq'::regclass),
document_id int4,
material_id int4,
stock_receipt_id int4,
quantity numeric(10,3),
CONSTRAINT stock_expenditure_pkey PRIMARY KEY (expenditure_id_pkey)
)

Полезные варианты 1 и 2.
1 - выдаёт остатки по всем материалам (независимо был ли приход/расход)
2 - только те где был приход

3-й - выдает ошибку :(

Если есть ещё идеи - буду очень благодарен.
...
Рейтинг: 0 / 0
Запрос: приход - (минус) расход
    #33885191
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправления для всех мат-ов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT mf.name, sum(coalesce(quantity, 0 )) FROM (
SELECT material_id, sum(quantity) as quantity FROM stock_receipt sr GROUP BY material_id
UNION ALL
SELECT material_id, -sum(quantity) as quantity FROM stock_expenditure se GROUP BY material_id
) q
RIGHT JOIN get_raw_materials() mf ON mf.id = q.material_id
GROUP BY q.material_id, mf.name
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос: приход - (минус) расход
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]