Как объединить даты между двумя точками, используя SQL? - PullRequest
0 голосов
/ 15 апреля 2020

TIA за любую помощь в решении этой проблемы, я довольно плохо знаком с SQL / SSMS.

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

ClientFK | LocationFK | Month     | Sales
---------|------------|-----------|-------
15       |1           |2019-04-01 | $100
15       |2           |2019-04-01 | $50
15       |2           |2019-03-01 | $30
15       |2           |2019-02-01 | $20

Как создать строки в местоположении 1, в котором в местоположении 2 были продажи? Вывод будет выглядеть следующим образом:

ClientFK | LocationFK | Month     | Sales
---------|------------|-----------|-------
15       |1           |2019-04-01 | $100
15       |1           |2019-03-01 | $0
15       |1           |2019-02-01 | $0
15       |2           |2019-04-01 | $50
15       |2           |2019-03-01 | $30
15       |2           |2019-02-01 | $20

Моя цель - сделать эту динамику c, поэтому я не пытаюсь работать с этим конкретным c клиентом / местоположением, это всего лишь пример , В идеале это должно работать для любой комбинации клиент / местоположение.

Опять же, я довольно новичок в этом и не знал, как лучше задать этот вопрос. Любой совет о том, как уточнить то, что я спрашиваю, также будет высоко оценен. Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Это даст вам все месяцы для всех местоположений и всех клиентов.

with AvailableDates as(
  select distinct [Month] from MonthlySales
),
Locations as(
  select distinct LocationFk from MonthlySales
),
Clients as(
  select distinct ClientFk from MonthlySales
)
select c.ClientFk, l.LocationFk, ad.Month, IsNull(ms.Sales,0) as Sales 
from Locations l
left join AvailableDates ad on 1=1
left join clients c on 1=1
left join MonthlySales ms on 
  l.LocationFk=ms.LocationFk 
  and c.ClientFk = ms.ClientFk 
  and ad.Month = ms.Month
order by  locationFK, Month desc
0 голосов
/ 15 апреля 2020

Вот способ go об этом. Сначала узнайте все уникальные месяцы для Location2.

Затем Carterisan Prod с данными Client1.

После этого у вас есть все записи для Client1 и Client2 в блоке carteisan prod, который оставил бы соединение с данными и установил sales = 0 для данных за пропущенные месяцы.

with loc2_data
  as (select distinct month
        from tbl
       where locationfk=2 
         and ClientFK=15
      )
     ,cartesian_prod 
      (
     select a.ClientFK,a.LocationFK,b.Month
       from tbl a
       join loc2_data b
         on 1=1 
      where a.locationfk=1
        and a.ClientFK=15
       )
select a.ClientFK,a.LocationFK,a.Month,isnull(v.Sales,0) as sales
  from cartesian_prod a
left join tbl v
     on a.ClientFK=v.ClientFK
    and a.LocationFK=v.LocationFK
    and a.Month=v.Month
...