Запрос на объединение 4 таблиц с внешним ключом и группирование по датам - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь объединить 4 таблицы. Я так, как я получу список продуктов, показывающих продажи и претензии, зарегистрированные в каждом месяце. Необходимо учитывать 4 комбинации:

  1. Продукт был продан в определенном месяце, и у нас есть претензии к нему.
  2. Продукт не был продан в течение определенного месяца, и у нас есть претензия на это.
  3. Товар был продан в определенный месяц, и у нас нет претензий к нему.
  4. Продукт не был продан определенный месяц, и у нас нет претензий к нему.

    Я начинаю думать, что создание таблицы дат может быть необходимым.

select
   ps.date,
   cl.date,
   ps.part_number,
   ps.sales_quantity,
   cl.claims_quantity
from (select convert(varchar(7), s.date, 120) as date, p.part_number, sum(id.quantity) as sales_quantity
   from parts as p
   left outer join invoice_details as id
   on p.part_number = id.part_number
   left outer join sales as s
   on id.invoice = s.invoice
   group by convert(varchar(7), s.date, 120), p.part_number
   ) ps join 
   (select convert(varchar(7), c.date_registered, 120) as date, p.part_number, sum(c.quantity) as claims_quantity
   from parts as p
   left outer join claims as c
   on p.part_number = c.part_number
   group by convert(varchar(7), c.date_registered, 120), p.part_number
   ) cl
   on ps.part_number = cl.part_number
group by ps.date, cl.date, ps.part_number, ps.sales_quantity, cl.claims_quantity
order by cl.claims_quantity desc

enter image description here

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Если я правильно понимаю, вы хотите строки для каждой части и месяца. Если это так, вам нужен какой-то метод генерации месяцев - потому что они могут отсутствовать в данных.

Затем используйте left join для ввода данных и агрегирования, чтобы получить необходимую информацию:

select p.part_number, m.mon,
       sum(sales_quantity), sum(claim_quantity)
from parts p cross join
     (select date('2020-01-01') as mon union all
      select date('2020-02-01') as mon 
     ) m left join
     ((select s.date, id.part_number, id.quantity as sale_quantity, null as claim_quantity
       from sales s join
            invoice_details id
            on id.id_sale = s.id_sale
      ) union all
      (select c.date_registered, null, null, quantity
       from claims
      )
     ) sc
     on sc.part_number = p.part_number and
        sc.date >= m.mon and
        sc.date < m.mon + interval 1 month
group by p.part_number, m.mon
0 голосов
/ 16 марта 2020

Код ниже не дает правильных результатов

declare @date1 date='2019-02-01';
declare @date2 date='2019-03-01';
declare @date3 date='2019-04-01';
declare @date4 date='2019-05-01';
declare @date5 date='2019-06-01';
declare @date6 date='2019-07-01';
declare @date7 date='2019-08-01';
declare @date8 date='2019-09-01';
declare @date9 date='2019-10-01';
declare @date10 date='2019-11-01';
declare @date11 date='2019-12-01';

select p.part_number, m.mon,
       sum(sales_quantity) AS SALES, sum(claim_quantity) AS CLAIMS
from parts p cross join 
     (select @date as mon union all
     select @date1 as mon union all
     select @date2 as mon union all
     select @date3 as mon union all
     select @date4 as mon union all
     select @date5 as mon union all
     select @date6 as mon union all
     select @date7 as mon union all
     select @date8 as mon union all
     select @date9 as mon union all
     select @date10 as mon union all
     select @date11 as mon
     ) m left join
     ((select s.date, id.part_number, id.quantity as sales_quantity, null as claim_quantity
       from sales s join
            invoice_details id
            on id.invoice = s.invoice
      ) union all
      (select date_registered, part_number, null, quantity
       from claims 
      )
     ) sc
     on sc.part_number = p.part_number and
        sc.date = m.mon and 
        sc.date < DATEADD(MONTH, +1, m.mon)
    where sc.part_number = 'TC1133' 
group by p.part_number, m.mon```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...