【问题标题】:How do I do a Cross Join when I don't have all the columns I need?当我没有我需要的所有列时,如何进行交叉连接?
【发布时间】:2018-03-15 17:42:49
【问题描述】:

我有两个查询,它们都创建了我想交叉连接的表。

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-01-01 到 2017-08-31,每个 SITA(有 30 个 SITA)和每个 Market_segment(有 18 个不同的 Market_segment,但每个 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 个段的表。

现在,我想要的是一个表格,其中每个日期从 2017 年 1 月 1 日到 2017 年 8 月 31 日,每个 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  

【问题讨论】:

  • 您能否为这个问题提供一些数据。我不关注你。
  • 不要认为你想在这里使用 CROSS JOIN 而是使用 LEFT 或 RIGHT JOIN... 第一个查询中的 Market_segment 与第二个查询中的 SEG 相同吗?我的意思是这种关系?没有示例表和数据很难说。
  • 是的,第一个查询中的 Market_segment 与第二个查询中的 SEG 相同 @RaymondNijland
  • 我认为您正在使用数据库 SQL-server,因为您的查询中没有 [dbo]。
  • 是的,我是。 @RaymondNijland

标签: sql-server join cross-join


【解决方案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 |
+-------+----+----+-------+-------------+----------------+----+-----+

【讨论】:

  • @Sorath 乐于助人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多