【问题标题】:How to group pivot dynamic array in javascript or MySQL?如何在 javascript 或 MySQL 中对数据透视动态数组进行分组?
【发布时间】:2019-09-24 17:51:17
【问题描述】:

基本上我想旋转动态数组,例如我从 MySQL 表中得到的这个数组:

[ { ruleAlias: 'DEMAND', date: '2019-03-22', count: 10 },
  { ruleAlias: 'VOUCHER', date: '2019-03-25', count: 20 },
  { ruleAlias: 'DEMAND', date: '2019-03-25', count: 10 },
  { ruleAlias: 'BILL', date: '2019-03-25', count: 2 },
  { ruleAlias: 'BILL', date: '2019-05-06', count: 1 } ]

我希望这个数组变成:

[ ['RULE', 'DEMAND', 'VOUCHER', 'BILL'],
  ['2019-03-22', 10, 0, 0],
  ['2019-03-25', 10, 20, 2],
  ['2019-05-06', 0, 0, 1]
]

这是我使用的 MySQL 查询:

SELECT ruleAlias, date, count
FROM (
    SELECT ruleAlias, DATE_FORMAT(createDate, '%Y-%m-%d') AS date, COUNT(DATE_FORMAT(createDate, '%Y-%m-%d')) AS count FROM histPoint WHERE ruleAlias IN (SELECT alias FROM mstRule WHERE clientId = 5) AND YEAR(createDate) = YEAR(CURDATE()) GROUP BY date, ruleAlias
) AS t

我得到的数据是动态的,例如上面的数据是3条规则,但是表中的数据可以得到3条以上的规则,如何在javascript中将这种数组pivot到预期的输出或直接在sql中pivot?

【问题讨论】:

    标签: javascript mysql sql node.js pivot


    【解决方案1】:

    您可以使用哈希表并收集给定日期/规则对的所有值。然后构建一个表,并为未给定的对使用默认零。

    const key = (...a) => a.join('|');
    
    var data = [{ ruleAlias: 'DEMAND', date: '2019-03-22', count: 10 }, { ruleAlias: 'VOUCHER', date: '2019-03-25', count: 20 }, { ruleAlias: 'DEMAND', date: '2019-03-25', count: 10 }, { ruleAlias: 'BILL', date: '2019-03-25', count: 2 }, { ruleAlias: 'BILL', date: '2019-05-06', count: 1 }],
        temp = {},
        result,
        dates = new Set,
        rules = new Set;
    
    data.forEach(({ ruleAlias, date, count }) => {
        dates.add(date);
        rules.add(ruleAlias);
        temp[key(date, ruleAlias)] = (temp[key(date, ruleAlias)] || 0) + count;
    });    
    
    result = [
        ['RULE', ...rules],
        ...Array.from(dates, date => [
            date,
             ...Array.from(rules, rule => temp[key(date, rule)] || 0)
        ])
    ];
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 使用单级 temp 散列和生成的密钥,例如date + '\n' + ruleAlias 可能会让这更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多