2017-10-04 18 views
2

我有兩個查詢都創建我想交叉連接的表。當我沒有所需的所有欄目時,如何進行交叉加入?

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 

此查詢給出了其具有從2017年1月1日的每個日期2017年8月31日與每個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段的表。

現在,我想要的是每個SITA和每個Market_Segment(每個日期將有30 x 18行)以及所有其他日期從2017-01-01到2017-08-31的表格來自第一個查詢的列也是; B,C,Rooms,StayDays as RN,AMTRoom as Rev.

當然,因爲所有日期和market_Segment/Seg組合都不在第一個表格中,所以我想只輸出RN和Rev爲0,但這些但B ,C,每個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 
+0

可以請包括這個問題的一些數據。我不跟着你。 –

+0

不要以爲您想在這裏使用CROSS JOIN,而是使用左或右連接...第一個查詢中的Market_segment與第二個Qeury中的SEG相同?我的意思是這種關係?沒有示例表格和數據很難說。 –

+0

是的,第一個查詢中的Market_segment與第二個查詢中的SEG相同@RaymondNijland – Sorath

回答

2

您需要cross joindistinct sita, B, C, Rooms, datearrivedSEG列表,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 | 
+-------+----+----+-------+-------------+----------------+----+-----+ 
+0

這個工程!非常感謝! – Sorath

+0

@Sorath樂意幫忙! – SqlZim

相關問題