javascript - 通过获取对象的总和来减少 SQL 查询结果

标签 javascript mysql reduce

我需要解决 2 个主要问题。

  1. Need to remove duplicate rows which I getting as a result of the SQL join query (which has one to many relationship).
  2. 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/

相关文章:

java - 避免在 Java 8 stream reduce 方法中使用全局变量

javascript - 使用 AngularJS 通过数组序列激活 CSS 类

javascript - 如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?

javascript - 对一个负数的数字求和

php - 如何将数组放入 SQL 中?

mysql - 连接两个不同列上的表

Hadoop Reducer 执行重现

javascript - XML文件和dtd关联

javascript - 对电子邮件进行内联验证时出现 406( Not Acceptable )错误

mysql - 如何将二进制数据(具有高字节值)保存到 unicode MySQL 行中