2015-07-11 45 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

相關問題