Как выполнить перекрестное соединение, если у меня нет всех нужных столбцов?

У меня есть два запроса, которые создают таблицы, которые я хотел бы объединить.

SELECT SITA, B, C, Rooms, Datearrived, Market_segment, StayDays as RN, AMTRoom as Rev
   FROM [UKRMC].[dbo].[revenue] rev
   JOIN [UKRMC].[dbo].[Contacts] contacts
   ON rev.hotel_id = contacts.id
   WHERE datearrived between '2017-01-01' and '2017-08-31' and C like '%GB%'
  ORDER BY sita

Этот запрос дает таблицу с каждой датой с 01.01.2017 по 31.08.2017 для каждого SITA (существует 30 SITA) и каждого Market_segment (существует 18 отдельных Market_segments, но каждый SITA не имеет всех Market_segments и вот в чем моя проблема).

Мой следующий запрос:

SELECT SEG       
FROM [UKRMC].[dbo].[Segmentation]
WHERE SEG IN ('RAC', 'BIT', 'BIQ', 'CBI', 'TOF', 'QOF', 'BOA', 'FIT', 'LYO', 'RER', 'OTH', 'NRG', 'XXX', 'CRW', 'BGR', 'BGO', 'LGR', 'LGS') 

Итак, это таблица из 18 сегментов.

Теперь мне нужна таблица, в которой есть каждая дата с 01.01.2017 по 31.08.2017 с каждым SITA и каждым Market_Segment (так что каждая дата будет иметь 30 x 18 строк) вместе со всеми другими столбцами из первого запрос тоже; B, C, Rooms, StayDays как RN, AMTRoom как Rev.

Конечно, поскольку все даты и комбинация market_Segment / Seg не входят в первую таблицу, я хотел бы просто вывести RN и Rev как 0 для них, но B, C, Rooms фиксированы для каждого SITA (так что мне понадобится еще одно соединение для фиксированные значения?)

Надеюсь, это имеет смысл. Любая помощь приветствуется! Вот примеры данных для двух запросов соответственно.

 SITA    B   C    Rooms  Datearrived Market_segment  RN   Rev
ABZPD   PI  GB   150    2017-01-01   TOF            2    45                                                                      
ABZPD   PI  GB   150    2017-01-01   BAO            33   30.5                                                                       
ABZPD   PI  GB   150    2017-01-01   BGR            11   50                                                                     
ABZPD   PI  GB   150    2017-01-01   NRG            52   10                                                                       
ABZPD   PI  GB   150    2017-01-01   CRW            20   90                                                                       
ABZPD   PI  GB   150    2017-01-01   BIT            7    20                                                                     
ABZPD   PI  GB   150    2017-01-01   CBI            0    40                                                                      
ABZPD   PI  GB   150    2017-01-01   OTH            10   50                                                                       
ABZPD   PI  GB   150    2017-01-01   BIQ            11   60                                                                       
ABZPD   PI  GB   150    2017-01-01   RER            12   65      



**SEG**
RAC       
BIT       
BIQ       
CBI       
TOF       
QOF       
BOA       
FIT       
LYO       
RER       
OTH       
NRG       
XXX       
CRW       
BGR       
BGO       
LGR       
LGS  

person Sorath    schedule 04.10.2017    source источник
comment
Не могли бы вы указать некоторые данные по этому вопросу? Я не слежу за тобой.   -  person Tim Biegeleisen    schedule 04.10.2017
comment
Не думаю, что вы хотите использовать здесь CROSS JOIN, но LEFT или RIGHT JOIN ... Market_segment в первом запросе совпадает с SEG во втором запросе? я имею в виду это отношение? сложно сказать без примеров таблиц и данных.   -  person Raymond Nijland    schedule 04.10.2017
comment
Да, Market_segment в первом запросе совпадает с SEG во втором запросе @RaymondNijland   -  person Sorath    schedule 04.10.2017
comment
И я думаю, что вы используете SQL-сервер базы данных, потому что в вашем запросе выключен [dbo].   -  person Raymond Nijland    schedule 04.10.2017
comment
Да, я. @RaymondNijland   -  person Sorath    schedule 04.10.2017
comment
Я добавил образцы данных сейчас! Надеюсь, это проясняет вопрос @TimBiegeleisen   -  person Sorath    schedule 04.10.2017
comment
Левое соединение просто дает мне те же данные, но просто объединяет их с SEG ... какие-нибудь другие идеи? @RaymondNijland   -  person Sorath    schedule 04.10.2017
comment
Нет, не ясно, какие результаты вы хотите ... поэтому сложно предложить запрос или идею ... можете ли вы также добавить ожидаемый результат в виде форматированного текста.   -  person Raymond Nijland    schedule 04.10.2017


Ответы (1)


Вам необходимо cross join distinct sita, B, C, Rooms, datearrived со своим SEG списком и left join исходным запросом. Я не могу сказать, откуда берутся столбцы в вашем запросе, поэтому я просто рассматриваю таблицу t как ваш исходный запрос.

select 
    d.SITA
  , d.B
  , d.C
  , d.Rooms
  , d.Datearrived
  , Market_segment = s.Seg
  , Rn  = isnull(t.rn,0)
  , Rev = isnull(t.Rev,0)
from (
  select distinct sita, B, C, Rooms, datearrived 
  from dbo.t -- whichever table has the above columns
  ) d
cross join (
  select SEG
  from dbo.Segmentation
  where SEG in ('RAC', 'BIT', 'BIQ', 'CBI', 'TOF', 'QOF', 'BOA', 'FIT', 'LYO', 'RER', 'OTH', 'NRG', 'XXX', 'CRW', 'BGR', 'BGO', 'LGR', 'LGS') 
  ) s
left join dbo.t 
  on d.datearrived = t.datearrived
 and d.sita = t.sita
 and s.seg = t.market_segment

Демонстрация rextester: http://rextester.com/WSFUO57652

возвращает:

+-------+----+----+-------+-------------+----------------+----+-----+
| SITA  | B  | C  | Rooms | Datearrived | Market_segment | Rn | Rev |
+-------+----+----+-------+-------------+----------------+----+-----+
| ABZPD | PI | GB |   150 | 2017-01-01  | RAC            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | BIT            |  7 |  20 |
| ABZPD | PI | GB |   150 | 2017-01-01  | BIQ            | 11 |  60 |
| ABZPD | PI | GB |   150 | 2017-01-01  | CBI            |  0 |  40 |
| ABZPD | PI | GB |   150 | 2017-01-01  | TOF            |  2 |  45 |
| ABZPD | PI | GB |   150 | 2017-01-01  | QOF            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | BOA            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | FIT            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | LYO            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | RER            | 12 |  65 |
| ABZPD | PI | GB |   150 | 2017-01-01  | OTH            | 10 |  50 |
| ABZPD | PI | GB |   150 | 2017-01-01  | NRG            | 52 |  10 |
| ABZPD | PI | GB |   150 | 2017-01-01  | XXX            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | CRW            | 20 |  90 |
| ABZPD | PI | GB |   150 | 2017-01-01  | BGR            | 11 |  50 |
| ABZPD | PI | GB |   150 | 2017-01-01  | BGO            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | LGR            |  0 |   0 |
| ABZPD | PI | GB |   150 | 2017-01-01  | LGS            |  0 |   0 |
+-------+----+----+-------+-------------+----------------+----+-----+
person SqlZim    schedule 04.10.2017
comment
@Sorath Рад помочь! - person SqlZim; 04.10.2017