SQL запрос для получения объединенной таблицы - PullRequest
0 голосов
/ 06 марта 2020

У меня есть две таблицы, к которым мне нужно присоединиться, и мне нужно получить данные, которые я могу использовать для построения графика.

Пример данных для двух таблиц:

  **table1**

mon_pjt  month  planned_hours
pjt1    01-10-2019  24
pjt2    01-01-2020  67
pjt3    01-02-2019  12



   **table2**
    date    project hrs_consumed
07-12-2019  pjt1    7
09-09-2019  pjt2    3
12-10-2019  pjt1    4
01-02-2019  pjt3    5
11-10-2019  pjt1    4

Пример выходных данных, где фактические часы являются суммой столбца hrs_consumed в таблице2. Ниже приведен пример вывода:

project label   planned_hours   actual_hours
pjt1    Oct-19  24                8
pjt1    Dec-19  0                 7
pjt2    Sep-19  0                 3
pjt2    Jan-20  67                0
pjt3    Feb-19  12                5

Я пробовал следующий запрос, но он выдает ошибку:

Select Sum(a.hrs_consumed), a.date, a.planned_hours
 From (SELECT t1.date, t2.month, t1.project, t1.hrs_consumed, t2.planned_hours
       from table1 t1 JOIN
            table2 t2 
            on t2.month = t1.date
       UNION
       SELECT t1.date, t2.month, t1.mon_pjt, t2.hrs_consumed, t1.planned_hours
       from table t1 JOIN
            table2 t2 
            on t1.date != t2.month
     ) 

Я пробовал другой способ, также извлекая две таблицы отдельно и в javascript пытаясь присоединиться к нему и отсортировать его, но это также было напрасно.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

В Javascript вы можете mimi c и SQL как запрос.

Этот код принимает канал и

  • выбирает нужный ключ и форматы date в сопоставимом формате
  • групп по date,
  • получает сумму hrs_consumed для каждой группы,
  • делает полное объединение (с обновленным набором данных для сопоставимых ключей / столбцов)
  • выбирает нужные ключи,
  • применяет сортировку.

const
    pipe = (...functions) => input => functions.reduce((acc, fn) => fn(acc), input),
    groupBy = key => array => array.reduce((r, o) => {
        var fn = typeof key === 'function' ? key : o => o[key],
            temp = r.find(([p]) => fn(o) === fn(p));
        if (temp) temp.push(o);
        else r.push([o]);
        return r;
    }, []),
    sum = key => array => array.reduce((a, b) => ({ ...a, [key]: a[key] + b[key] })),
    select = fn => array => array.map(fn),
    fullJoin = (b, ...keys) => a => {
        const iter = (array, key) => array.forEach(o => {
            var k = typeof key === 'function' ? key(o) : o[key];
            temp[k] = { ...(temp[k] || {}), ...o };
        });

        var temp = {};
        iter(a, keys[0]);
        iter(b, keys[1] || keys[0]);
        return Object.values(temp);
    },
    order = keys => array => array.sort((a, b) => {
        var result;
        [].concat(keys).some(k => result = a[k] > b[k] || -(a[k] < b[k]));
        return result
    });

var table1 = [{ mon_pjt: 'pjt1', month: '2019-10', planned_hours: 24 }, { mon_pjt: 'pjt2', month: '2020-01', planned_hours: 67 }, { mon_pjt: 'pjt3', month: '2019-02', planned_hours: 12 }],
    table2 = [{ date: '2019-12-07', project: 'pjt1', hrs_consumed: 7 }, { date: '2019-09-09', project: 'pjt2', hrs_consumed: 3 }, { date: '2019-10-12', project: 'pjt1', hrs_consumed: 4 }, { date: '2019-02-01', project: 'pjt3', hrs_consumed: 5 }, { date: '2019-10-11', project: 'pjt1', hrs_consumed: 4 }],
    result = pipe(
        select(o => ({ ...o, date: o.date.slice(0, 7) })),
        groupBy('date'),
        select(sum('hrs_consumed')),
        fullJoin(
            select
                (({ mon_pjt: project, month: date, ...o }) => ({ project, date, ...o }))
                (table1),
            'date'
        ),
        select(({ project, date: label, planned_hours = 0, hrs_consumed = 0 }) => ({ project, label, planned_hours, hrs_consumed })),
        order(['project', 'label'])
    )(table2);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 06 марта 2020

ВЫБРАТЬ проект, метка, запланированные часы, (запланированные часы-часы_ потребляются) AS

actual_hours

ОТ (

ВЫБРАТЬ t1.mon_pjt AS проект, date_format (t1.month, '% M-% Y') метка AS,

t1.planned_hours, 0 AS часов_расходовано

FROM table1 t1

UNION

SELECT t2.project , метка date_format (t2.date, '% M-% Y') AS, 0 как плановые часы,

сумма (t2.hours_consumed) AS часов_ потреблено

FROM table1 t2

GROUP BY проект) t

GROUP BY t.project ЗАКАЗАТЬ по проекту

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...