SQL Server - Матрица нескольких запросов WHERE - PullRequest
0 голосов
/ 17 мая 2018

Если у меня есть таблица, подобная приведенной ниже:

Source  Event           Date        Qty
Site A  Create Account  5/05/2018   6
Site B  Create Account  4/05/2018   12
Site A  Update Account  6/05/2018   1
Site A  Update Notes    7/05/2018   2
Site B  Add Dependant   5/05/2018   1
Site C  Create Account  5/05/2018   14

И еще одна такая:

Date        OrdersRec
4/05/2018   162
5/05/2018   123
6/05/2018   45
7/05/2018   143

И я хочу построить своего рода матричную таблицу, чтобы иметь возможность использовать снова иснова для запросов с различными датами, например:

Date        Create  Update  UpdateNotes AddDependant    OrdersRec
4/05/2018   12      0       0           0               162
5/05/2018   20      0       0           1               123
6/05/2018   0       1       0           0               45
7/05/2018   0       0       2           0               143

Каков наилучший способ сделать это?

Я начал с INSERT для дат и чисел CreateAccount, ноЯ не уверен, как вернуться и обновить другие подсчеты для определенных дат, или даже если это глупо, и я упускаю что-то очевидное.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Просто используйте union all или join. Для этого нет причин создавать новую таблицу:

select date, sum(v_create) as v_create, sum(v_update) as v_update,
       sum(v_updatenotes) as v_updatenotes, sum(v_adddependent) as v_adddependent,
       sum(orderrec) as orderec
from ((select t1.date, v.*, 0 as OrdersRec
       from table1 t1 cross apply
            (values ( (case when event = 'Create Account' then quantity else 0 end),
                      (case when event = 'Update Account' then quantity else 0 end),
                      (case when event = 'Update Notes' then quantity else 0 end),
                      (case when event = 'Add Dependent' then quantity else 0 end)
                    )
             ) v(v_create, v_update, v_updatenotes, v_adddependent)
      ) union all
      (select date, 0, 0, 0, 0, orderrec
       from table2
      )
     ) t
group by date
order by date;

Это обрабатывает множество крайних случаев, например, когда даты отсутствуют в одной или других таблицах.

0 голосов
/ 17 мая 2018

Почему бы вам не создать таблицу переменных со всеми датами и использовать ее в качестве основной таблицы.

Тогда вы бы так что-то вроде этого

select m.date,
sum(case when event = 'Create Account' then 1 else 0) as create,
sum(case when event = 'Update Account' then 1 else 0) as updates,
sum(o.ordersrec) as orders
from @main as m
       inner join @orders as o on o.date = m.date
       inner join @events as e on e.date = m.date
group by m.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...