Как сгруппировать динамический массив Pivot в JavaScript или MySQL? - PullRequest
2 голосов
/ 07 мая 2019

В основном я хочу развернуть динамический массив, например этот массив, полученный из таблицы 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 или непосредственно в SQL?? 1010 *

1 Ответ

0 голосов
/ 07 мая 2019

Вы можете взять хеш-таблицу и собрать все значения для данной пары дата / правило. Затем создайте таблицу и используйте ноль по умолчанию для не указанных пар.

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; }
...