Здравствуйте)
Дано три таблицы:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
--Таблица каталога продуктов
CREATE TABLE catalog (cid NUMBER PRIMARY KEY, -- id раздела
par_cid NUMBER REFERENCES catalog, -- ссылка на родительский раздел
rname varchar2(400), -- наименование раздела
rdescr varchar2(4000), -- описание
rcdate DATE -- дата создания
);
--Таблица продуктов
CREATE TABLE products (pid NUMBER PRIMARY KEY, -- id продукта
rcid NUMBER REFERENCES catalog, -- ссылка на каталог
pname varchar2(500), -- наименование продукта
pdescr varchar2(4000), -- спецификация
punit NUMBER REFERENCES units, -- единица измерения
pper NUMBER REFERENCES persons -- ответственный
);
--Таблица движения продуктов
CREATE TABLE records (rpid NUMBER REFERENCES products, -- продукт
rdate DATE, -- дата операции
incoming varchar2(2) DEFAULT '1', -- поступление '1', расход '0'
quantity NUMBER, -- количество
rate NUMBER -- цена в рублях
);
Требуется написать sql запрос для вывода примерно в таком виде:
<Наименование раздела каталога уровня1> || Поступление. Руб. || Расход. Руб
...
<Наименование раздела каталога уровня(K-1)> || Поступление. Руб. || Расход. Руб
<Наименование раздела каталога уровня(K)> || Поступление. Руб. || Расход. Руб
<Наименование Продукта1 этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
...
<Наименование ПродуктаN этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
<Наименование раздела каталога уровня(K)> || Поступление. Руб. || Расход. Руб
<Наименование Продукта1 этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
...
<Наименование ПродуктаN этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
<Наименование раздела каталога уровня1> || Поступление. Руб. || Расход. Руб
... и так далее аналогично
Расчет для разделов должен выполняться в соответствии с иерархией. Количество уровней иерархии не ограничено.
Я написал следующий код для создания недостающих таблиц и заполнения всех таблиц данными:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
--units - Таблица "единиц измерения"
CREATE TABLE units (
Id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, --Идентификатор units (Автоматическая нумерация, первичный ключ)
Unit varchar2(150) NOT NULL --Название units
);
--Persons - Таблица "Сотрудники"
CREATE TABLE Persons (
Id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, --Идентификатор сотрудника (Автоматическая нумерация, первичный ключ)
Name varchar2(150) NOT NULL --ФИО сотрудника
);
--Данные Persons - Таблица "Сотрудники"
BEGIN
INSERT INTO Persons (Name) VALUES ('Иванов И. Г.');
INSERT INTO Persons (Name) VALUES ('Смолин А. С.');
INSERT INTO Persons (Name) VALUES ('Панасенко С. Н.');
INSERT INTO Persons (Name) VALUES ('Поповский М. Ф.');
INSERT INTO Persons (Name) VALUES ('Васильев М. С.');
INSERT INTO Persons (Name) VALUES ('Ткаченко И. В.');
END;
--Данные units - Таблица "единиц измерения"
INSERT INTO units (Unit) VALUES ('Шт.');
--Данные catalog - Таблица каталога продуктов
BEGIN
INSERT INTO catalog VALUES (1, NULL, 'Каталог', 'Описание Каталог', TIMESTAMP '2021-01-20 7:55:00');
INSERT INTO catalog VALUES (2, 1, 'Стройматериалы', 'Описание Стройматериалы', TIMESTAMP '2021-01-21 7:55:00');
INSERT INTO catalog VALUES (3, 1, 'Сантехника', 'Описание Сантехника', TIMESTAMP '2021-01-22 7:55:00');
INSERT INTO catalog VALUES (4, 1, 'Электротовары ', 'Описание Электротовары', TIMESTAMP '2021-01-23 7:55:00');
BEGIN
INSERT INTO catalog VALUES (5, 2, 'Штукатурки', 'Описание Штукатурки', TIMESTAMP '2021-01-24 7:55:00');
INSERT INTO catalog VALUES (6, 2, 'Грунтовки', 'Описание Грунтовки', TIMESTAMP '2021-01-25 7:55:00');
INSERT INTO catalog VALUES (7, 3, 'Ванны ', 'Описание Ванны', TIMESTAMP '2021-01-26 7:55:00');
INSERT INTO catalog VALUES (8, 3, 'Унитазы', 'Описание Унитазы', TIMESTAMP '2021-01-27 7:55:00');
INSERT INTO catalog VALUES (9, 4, 'Удлинители', 'Описание Удлинители', TIMESTAMP '2021-01-28 7:55:00');
INSERT INTO catalog VALUES (10, 4, 'Инструменты', 'Описание Инструменты', TIMESTAMP '2021-01-29 7:55:00');
END;
--Данные products - Таблица продуктов
BEGIN
INSERT INTO products VALUES (1, 5, 'Штукатурка1', 'Спецификация Штукатурка1', 1, 1);
INSERT INTO products VALUES (2, 5, 'Штукатурка2', 'Спецификация Штукатурка2', 1, 2);
INSERT INTO products VALUES (3, 6, 'Грунтовка1', 'Спецификация Грунтовка1', 1, 3);
INSERT INTO products VALUES (4, 6, 'Грунтовка2', 'Спецификация Грунтовка2', 1, 4);
INSERT INTO products VALUES (5, 7, 'Ванна1', 'Спецификация Ванна1', 1, 5);
INSERT INTO products VALUES (6, 7, 'Ванна2', 'Спецификация Ванна2', 1, 6);
INSERT INTO products VALUES (7, 8, 'Унитаз1', 'Спецификация Унитаз1', 1, 1);
INSERT INTO products VALUES (8, 8, 'Унитаз2', 'Спецификация Унитаз2', 1, 2);
INSERT INTO products VALUES (9, 9, 'Удлинитель1', 'Спецификация Удлинитель1', 1, 3);
INSERT INTO products VALUES (10, 9, 'Удлинитель2', 'Спецификация Удлинитель2', 1, 4);
INSERT INTO products VALUES (11, 10, 'Инструмент1', 'Спецификация Инструмент1', 1, 5);
INSERT INTO products VALUES (12, 10, 'Инструмент2', 'Спецификация Инструмент2', 1, 6);
END;
Вывел все каталоги:
1. 2. 3. 4. 5.
SELECT cid, par_cid, rname
FROM catalog
START WITH par_cid IS NULL
CONNECT BY PRIOR cid = par_cid
ORDER BY cid;
Глубже в рекурсию не знаю, как написать запрос. Можете подсказать, как дальше?
|