2015-07-11 47 views
1

我使用SQL Server 2014和我有一个使用3个表给我与住客,保留下面的输出中的简单查询:如何修改此SQL查询以获取位于其他表中的信息?

查询看起来是这样的:

USE MyDatabase 

SELECT a.ResID, a.Name, a.Property, c.ArrivalDate,c.DepartureDate,c.ConfNum, 
d.CHAR07, c.StatusCode,c.CreatedOn, c.UpdatedBy, c.CreatedBy 
FROM GuestStaySummary a 
    left join GuestNameInfo b on b.ResID = a.ResID 
    left join reservationstay c on c. ResID = a. ResID 
WHERE a.PrimaryGuest = '+' 

输出是如下所示:

ResID  Property Name  ArrivalDate DepartureDate ConfNum StatusCode CreatedOn UpdatedBy CreatedBy 
125   ABC  Jones  2015-08-20 2015-08-27 659874  CONFIRMED 2015-03-10  AP01  AP01 

由于系统上的应用程序升级,所有预留都被取消并重新创建。因此,进入上述成了如下:

ResID  Property Name  ArrivalDate DepartureDate ConfNum StatusCode CreatedOn UpdatedBy CreatedBy 
125   ABC  Jones  2015-08-20 2015-08-27 659874  CANCELED 2015-03-10  R5  AP01 
358   ABC  Jones  2015-08-20 2015-08-27 742651  CONFIRMED 2015-05-15  R5  AP01 

原来ResID 125现在有一个StatusCode为“取消”,并已与新的ResId和新ConfNum重新创建。

ResId 125(现Res ID 358)的原始CreatedOn(即2015-03-10)对我的分析目的非常重要。换句话说,我需要链接ResID 358的CreatedOn与2015-03-10而不是它的新的CreatedOn这是2015-05-15。

链接这两个条目的唯一方法是使用已存储在称为的表中的名为CHAR07的列中的“原始”ConfNum

我已经修改我的查询如下检索“取消”保留所有的名单和他们的等价物“新的”保留:

USE MyDatabase 

SELECT a.ResID, a.Name, a.Property, c.ArrivalDate,c.DepartureDate,c.ConfNum, 
d.CHAR07 AS ‘Original ConfNum’, c.StatusCode,c.CreatedOn, c.UpdatedBy,  c.CreatedBy 
FROM GuestStaySummary a 
    left join GuestNameInfo b on b.ResID = a.ResID 
    left join reservationstay c on c. ResID = a. ResID 
    left join P5RESERVATIONSTAY d on d.RSY_RESERVATIONSTAYID = a.ResID 
    left join P5RESERVATIONSTAY d2 on d2.CHAR07 = c.ConfNum 
WHERE b.PrimaryGuest = '+' 

输出如下内容:

ResID  Property Name  ArrDate  DepDate  ConfNum  Original ConfNum  StatusCode  CreatedOn UpdatedBy CreatedBy 
125   ABC  Jones  2015-08-20 2015-08-27 659874   NULL    CANCELED 2015-03-10  R5  AP01 
358   ABC  Jones  2015-08-20 2015-08-27 742651   659874    CONFIRMED 2015-05-15  R5  AP01 

它可以完成这项工作,但我需要在Excel中使用VLOOKUP来获取原始的CreatedOn。

我想我的SQL查询给我下面的输出:

ResID Property Name ArrDate  DepDate  ConfNum  Original ConfNum StatusCode  CreatedOn  OriginalCreatedOn UpdatedBy CreatedBy 

358  ABC  Jones 2015-08-20 2015-08-27 742651  659874    CONFIRMED 2015-05-15  2015-03-10  R5  AP01 

我怎样才能做到这一点?

+0

不确定为什么要使用所有左连接。一旦过滤了'PrimaryGuest',无论如何您都有效地获得了内连接。你也加入到'd2'中,但是不要使用它的任何一列,我真的不明白为什么你一开始就使用这个表格两次。 – shawnt00

+0

我加入到d2的逻辑,它会帮助我获取原始的CreatedOn,并将其与“新”预订相匹配,但我被困在我的编码的这个级别。所以,我把它留在那里。 – user3115933

回答

0

难道你真的只需要再次回到reservationstay?我认为内部连接会照顾只包括正确的取消和重新创建的行,但我不是100%确定的,因为我不知道你有什么其他数据。

SELECT 
    gss.ResID, gss.Property, gss.Name, rs.ArrivalDate, rs.DepartureDate, rs.ConfNum, 
    p5rs.CHAR07 as "Original ConfNum", rs.StatusCode, rs.CreatedOn, 
    rsorg.CreatedOn as "Original CreatedOn", rs.UpdatedBy, rs.CreatedBy 
FROM 
    GuestStaySummary as gss 
    inner join GuestNameInfo  as gni on gni.ResID = gss.ResID 
    inner join reservationstay as rs on rs.ResID = gss.ResID 
    inner join P5RESERVATIONSTAY as p5rs on p5rs.RSY_RESERVATIONSTAYID = gss.ResID 
    inner join reservationstay as rsorg on rsorg.ConfNum = p5rs.CHAR07 
WHERE 
    gni.PrimaryGuest = '+' 
+0

谢谢。我会在星期一测试你的解决方案。我现在无法访问服务器进行测试! – user3115933

+0

谢谢!正是我需要的! – user3115933

相关问题