SELECT
o.order_id,
d.name AS dname,
c.customer,
o.date,
array_agg(
json_build_object(
'id_works', w.id_work::text,
'name_object', w.name_object,
'work_items', subq.work_items
)
) AS works_info
FROM "order" o
JOIN works w ON o.order_id = w.id_order
JOIN departaments d ON o.departament_id = d.departament_id
JOIN customers c ON o.customer_id = c.customer_id
LEFT JOIN (
SELECT
w.id_work,
w.name_object,
json_agg(json_build_object(
'n_works', e.n_work::text,
'type_works', tw.type_work,
'printers', pr.printer,
'materials', ma.material,
'performers', pe.performer,
'formats', f.format,
'n_sheets', e.n_sheets::text
)) AS work_items
FROM works w
LEFT JOIN expenses e ON w.id_work = e.n_plan
LEFT JOIN type_work tw ON e.type_work_id = tw.type_work_id
LEFT JOIN printer pr ON e.printer_id = pr.printer_id
LEFT JOIN material ma ON e.material_id = ma.material_id
LEFT JOIN performers pe ON e.performer_id = pe.performer_id
LEFT JOIN format f ON e.format_id = f.format_id
GROUP BY w.id_work, w.name_object
) AS subq ON w.id_work = subq.id_work
GROUP BY o.order_id, d.name, c.customer, o.date
{
order_id: 13,
dname: "ПЭО",
customer: "Лимановский Р.А.",
date: "2010-01-14T21:00:00.000Z",
works_info: [
{
id_works: "30",
name_object: "какой-то",
work_items: [
{
n_works: "31",
type_works: "Цветная печать",
printers: "HP DesignJet 500",
materials: "914*50m",
performers: "Хакимов Р.С.",
formats: "A1",
n_sheets: "0.0"
}
]
},
{
id_works: "34",
name_object: "какой-то",
work_items: [
{
n_works: "35",
type_works: "Ч/б печать",
printers: "Kyosera 3510i",
materials: "A3",
performers: "Буракова О.Ю.",
formats: "A3",
n_sheets: "0.0"
},
{
n_works: "36",
type_works: "Цветная печать",
printers: "HP DesignJet 500",
materials: "914*50m",
performers: "Хакимов Р.С.",
formats: "A1",
n_sheets: "0.0"
},
]
},
{
id_works: "32",
name_object: "какой-то",
work_items: [
{
n_works: "33",
type_works: "Цветная печать",
printers: "HP DesignJet 500",
materials: "914*50m",
performers: "Хакимов Р.С.",
formats: "A1",
n_sheets: "0.0"
}
]
}
]
}
GROUP BY w.id_work и 5 в 3 запихивать на стороне клиента базыпопробую скорее всего это.
исключить w.id_work из запросадля меня это не вариант, т.к. данные мне оттуда всё таки нужны.
хамить на уточняющие вопросы - харам.был бы уточняющий, я бы ответил, и даже расписал, что конкретно не понятно.
и вы хотите, чтобы мы подсказали вам, чего вы хотите от этих двух столбцов?по моему это не очень уточняющий вопрос и выглядит как "И чё хочет эта челядь ?"
Для более конкретного ответа опишите логику, в каком виде вы хотите получить несколько w.id_work у одного o.order_id в выборке.ну не знаю поймёте ли вы, если скажу что хочу получить из запроса тройной массив
что вы себе фантазируете, БД не предполагает, приземлитесь уже.Братик квадратик ты чем читал ?
если вдруг не понятно из контекста, то агрегацией я занимаюсь впервые,
И банально даже не знаю можно ли так сделать. Вот вопрос может ли быть в одной строке реализовано вывод столбцов o.order_id, w.id_work, e.n_plan. При этом получая три записи, а не пять как у меня, так как уникальных order_id 3?
function accepting_expenses_array(req, res) {
const expenses_array = req.body;
const expenses_as_numbers = expenses_array.map(Number);
// Определяем MAX(id_work) из таблицы "works"
pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
if (error) {
throw error;
}
const maxIdWork = maxResult.rows[0].max;
// Формируем INSERT-запрос и значения для вставки
let insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ';
let values = [];
for (let i = 0; i < expenses_as_numbers.length; i += 8) {
if (i !== 0) {
insertQuery += ', ';
}
insertQuery += `($${i * 8 + 1}, $${i * 8 + 2}, $${i * 8 + 3}, $${i * 8 + 4}, $${i * 8 + 5}, $${i * 8 + 6}, $${i * 8 + 7}, $${i * 8 + 8})`;
// Формируем значения для вставки
values.push(maxIdWork, ...expenses_as_numbers.slice(i, i + 8));
}
console.log(values);
console.log(insertQuery);
});
}
function accepting_expenses_array(req, res) {
const expenses_array = req.body;
const expenses_as_numbers = expenses_array.map(Number);
// Определяем MAX(id_work) из таблицы "works"
pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
if (error) {
throw error;
}
const maxIdWork = maxResult.rows[0].max;
// Формируем INSERT-запрос и значения для вставки
let insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ';
let values = [];
for (let i = 0; i < expenses_as_numbers.length; i += 8) {
if (i !== 0) {
insertQuery += ', ';
}
insertQuery += '($${i * 8 + 1}, $${i * 8 + 2}, $${i * 8 + 3}, $${i * 8 + 4}, $${i * 8 + 5}, $${i * 8 + 6}, $${i * 8 + 7}, $${i * 8 + 8})';
// Формируем значения для вставки
values.push(maxIdWork, ...expenses_as_numbers.slice(i, i + 8));
}
console.log(values);
// Выполняем запрос
pool.query(insertQuery, values, (insertError, insertResult) => {
if (insertError) {
throw insertError;
}
res.status(200).json(insertResult.rows);
});
});
}
ошибка синтаксиса (примерное положение: "{")