我需要解决 2 个主要问题。
- Need to remove duplicate rows which I getting as a result of the SQL join query (which has one to many relationship).
- Need to reduce the SQL result calculating the sum of the corresponding values.
我的SQL查询如下。
SELECT
ki.item_code,
i.NAME AS item_name,
it.item_type_name,
ist.item_sub_type_name,
s.company_name,
rg.delivered_quantity,
rg.measuring_unit AS delivered_measuring_unit,
DATE_FORMAT( rg.manufactured_date, '%Y-%m-%d' ) AS manufactured_date,
DATE_FORMAT( rg.expiry_date, '%Y-%m-%d' ) AS expiry_date,
ki.total_quantity,
ki.measuring_unit AS total_measuring_unit,
ki.available_quantity
FROM
vx_hms.kitchen_inventory ki
INNER JOIN vx_hms.issued_items ii ON ki.issued_items_id = ii.id
INNER JOIN vx_hms.main_inventory mi ON ii.main_inventory_id = mi.id
INNER JOIN vx_hms.good_received_note grn ON mi.good_received_note_no = grn.good_received_note_no
INNER JOIN vx_hms.received_goods rg ON grn.good_received_note_no = rg.good_received_note_no
INNER JOIN vx_hms.items i ON i.item_code = ki.item_code
INNER JOIN vx_hms.item_type it ON i.item_type = it.item_type_name
INNER JOIN vx_hms.item_sub_type ist ON i.item_sub_type = ist.item_sub_type_name
INNER JOIN vx_hms.supplier s ON grn.supplier_id = s.id
INNER JOIN vx_hms.supplier_items si ON s.id = si.supplier_id
WHERE
si.active_status = 1
AND rg.active_status = 1
AND s.active_status = 1
ORDER BY
rg.expiry_date
这是我得到的 SQL 结果。
[ {
item_code: '130A',
item_name: 'Item_name',
item_type_name: 'Food',
item_sub_type_name: 'Rice',
company_name: 'Abc pvt ltd',
delivered_quantity: 100,
delivered_measuring_unit: 'kg',
manufactured_date: null,
expiry_date: null,
total_quantity: 10,
total_measuring_unit: 'kg',
available_quantity: 10 },
{
item_code: '130A',
item_name: 'Item_name',
item_type_name: 'Food',
item_sub_type_name: 'Rice',
company_name: 'Abc pvt ltd',
delivered_quantity: 100,
delivered_measuring_unit: 'kg',
manufactured_date: null,
expiry_date: null,
total_quantity: 5,
total_measuring_unit: 'kg',
available_quantity: 5 },
{
item_code: '130A',
item_name: 'Item_name',
item_type_name: 'Food',
item_sub_type_name: 'Rice',
company_name: 'Abc pvt ltd',
delivered_quantity: 100,
delivered_measuring_unit: 'kg',
manufactured_date: null,
expiry_date: null,
total_quantity: 5,
total_measuring_unit: 'kg',
available_quantity: 5 },
{
item_code: '130A',
item_name: 'Item_name',
item_type_name: 'Food',
item_sub_type_name: 'Rice',
company_name: 'Abc pvt ltd',
delivered_quantity: 100,
delivered_measuring_unit: 'kg',
manufactured_date: null,
expiry_date: null,
total_quantity: 10,
total_measuring_unit: 'kg',
available_quantity: 10 } ]
它有重复的行。我尝试使用 GROUP BY 和 DISTINCT,但它对我不起作用。
然后我尝试按如下方式减少结果。我认为不适合使用“includes()”,因为它会忽略 SQL 结果中的相似值。
const inventoryByItemCode = _.reduce(result, function(a, item) {
const { item_code, item_name, item_type_name, item_sub_type_name, company_name, delivered_quantity, delivered_measuring_unit, manufactured_date, expiry_date, total_quantity, total_measuring_unit, available_quantity } = item;
if (!a[item_code]) {
a[item_code] = { item_code, item_name, item_type_name,
item_sub_type_name, delivered_measuring_unit, company_name:[],
delivered_quantity:[], manufactured_date:[], expiry_date:[],
total_quantity:[], total_measuring_unit, available_quantity:[] };
}
if (!a[item_code].company_name.includes(company_name)) {
a[item_code].company_name.push(company_name);
}
if (!a[item_code].delivered_quantity.includes(delivered_quantity)) {
a[item_code].delivered_quantity.push(delivered_quantity);
}
if (!a[item_code].total_quantity.includes(total_quantity)) {
a[item_code].total_quantity.push(total_quantity);
}
if (!a[item_code].manufactured_date.includes(manufactured_date)) {
a[item_code].manufactured_date.push(manufactured_date);
}
if (!a[item_code].expiry_date.includes(expiry_date)) {
a[item_code].expiry_date.push(expiry_date);
}
if (!a[item_code].available_quantity.includes(available_quantity)) {
a[item_code].available_quantity.push(available_quantity);
}
return a;
}, {});
const obj = Object.values(inventoryByItemCode);
在我的例子中,我需要按如下方式计算“total_quantity”的总数。
[ { item_code: '130A',
item_name: 'Item_name',
item_type_name: 'Food',
item_sub_type_name: 'Rice',
delivered_measuring_unit: 'kg',
company_name: [ 'Abc pvt ltd' ],
delivered_quantity: [ 100 ],
manufactured_date: [ null ],
expiry_date: [ null ],
total_quantity: 15,
total_measuring_unit: 'kg',
available_quantity: [5, 10] } ]
最佳答案
我不确定这是否适用于每个用例。我认为您的数据库查询或数据库标准化可以做得更好。
const products = [
{
company_name: "Abc pvt ltd",
total_quantity: 10,
available_quantity: 10
},
{
company_name: "Abc pvt ltd",
total_quantity: 5,
available_quantity: 5
},
{
company_name: "Abc pvt ltd",
total_quantity: 5,
available_quantity: 5
},
{
company_name: "Abc pvt ltd",
total_quantity: 10,
available_quantity: 10
}
];
const result = products.reduce((acc, obj) => {
if (!acc.company_name) {
acc = {
company_name: obj.company_name,
total_quantity: 0,
available_quantity: []
};
}
if (acc.available_quantity.findIndex(i => i === obj.available_quantity) === -1) {
acc.total_quantity += obj.total_quantity;
acc.available_quantity.push(obj.available_quantity);
}
return acc;
}, {});
console.log("result filtered: ", result);
关于javascript - 通过获取对象的总和来减少 SQL 查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165209/