Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何修改现有查询以考虑自定义表中的特定列?_Sql_Sql Server_Join_Left Join - Fatal编程技术网

Sql 如何修改现有查询以考虑自定义表中的特定列?

Sql 如何修改现有查询以考虑自定义表中的特定列?,sql,sql-server,join,left-join,Sql,Sql Server,Join,Left Join,我正在使用SQL Server 2014和当前查询的摘录,如下所示。我的问题与我查询的最后一条SELECT语句有关。现在它工作正常,输出如下: ReservationStayID ........... XBEV01 XBEV02 XBEV03 XFOOD1 XFOOD2 215 ........... 1500 0 0 300 100 356 ........... 500

我正在使用SQL Server 2014和当前查询的摘录,如下所示。我的问题与我查询的最后一条SELECT语句有关。现在它工作正常,输出如下:

ReservationStayID ........... XBEV01   XBEV02   XBEV03  XFOOD1   XFOOD2
     215          ...........  1500      0        0      300       100
     356          ...........   500      200      0      600       700
     620          ...........   300      0        600     0        200
现在我创建了一个名为Extras的表,它如下所示:

 Code       Description          RevenueType
XBEV01     Beverage Bar A      Beverage Charge
XBEV01     Beverage Bar A      Beverage Charge
XBEV01     Beverage Bar A      Beverage Charge
XFOOD1     Food A              Food Charge
XFOOD2     Food B              Food Charge
ReservationStayID ........... Beverage Charge     Food Charge
     215          ...........  1500                  400
     356          ...........   700                 1300
     620          ...........   900                  200
我想修改我的查询,以便输出如下所示:

 Code       Description          RevenueType
XBEV01     Beverage Bar A      Beverage Charge
XBEV01     Beverage Bar A      Beverage Charge
XBEV01     Beverage Bar A      Beverage Charge
XFOOD1     Food A              Food Charge
XFOOD2     Food B              Food Charge
ReservationStayID ........... Beverage Charge     Food Charge
     215          ...........  1500                  400
     356          ...........   700                 1300
     620          ...........   900                  200
我知道我需要与Extras表的Code列和P5FolioCharge表的FOC_TRANSACTIONCODE列进行左连接,但我不知道如何在查询中实现它。 我想我需要修改查询的最后一个SELECT语句中的SUM语句

以下是我当前查询的摘录:

USE MyDatabase

SELECT 
  x.[ReservationStayID],
  b.PropertyCode,
  c.PMSConfirmationNumber,
  j.FOH_PMSCONFIRMATIONNUMBER,
  y.FOC_ACCOUNT,
   .......  
  b.GuestCount AS 'Total Guest',
  x.[Nights Spent] AS 'Room Nights',
  x.[MTH],
  x.[Rate] AS 'Room Rate WITH VAT',
  c.CurrencyCode, --added
  h.ROE AS 'Rate of Exchange', 
  (x.[Nights Spent]*x.[Rate]*h.[ROE])/NULLIF(1.15,0) AS 'PkgRevenue, Excl. VAT', 
  ((x.[Nights Spent]*x.[Rate]*h.[ROE])/1.15)/NULLIF((b.GuestCount*x.[Nights Spent]),0) AS 'GADR, Excl. VAT', 
  x.CreatedOn,
  x.[DateOfArrival],
  x.[DateOfDeparture],

  e.TravelAgencyTypeCode AS 'Source of Business', 
  c.TAProfileID, 
  e.Name AS 'Tour Operator',
  g.CountryGroup AS 'Market',
  c.TAProfileID2, --added
  e2.Name AS 'Booking Origin (1)', 
  g2.CountryGroup AS 'Booking Origin (2)',
  y.[NetAmount(XBEV01)],
  y.[NetAmount(XBEV02)],
  y.[NetAmount(XBEV03)],
  y.[NetAmount(XFOOD1)],
  y.[NetAmount(XFOOD2)]

  FROM GuestNameInfo a
  JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
  LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
  LEFT JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID 
  LEFT JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID 
  LEFT JOIN Market g ON e.CountryCode = g.CountryCode --added
  LEFT JOIN TravelAgency e2 ON e2.TravelAgencyID = c.TAProfileID2
  LEFT JOIN Market g2 ON e2.CountryCode = g2.CountryCode --added
  LEFT JOIN Exrate h ON h.Ccode = c.CurrencyCode -- added
  LEFT JOIN RoomCat i ON b.PropertyCode = i.Property AND d.rsl_roomtype = i.RoomType 
  LEFT JOIN P5FOLIOHEADER j ON J.FOH_PMSCONFIRMATIONNUMBER =    C.PMSConfirmationNumber


 LEFT JOIN
 (
   SELECT 
     ReservationStayID,
     datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) as [MTH],
     count(*) AS [Nights Spent],
     avg(RateAmount) as [Rate],
     min(CreatedOn) as CreatedOn,
     min(StayDate) as [DateOfArrival],
     max(StayDate) as [DateOfDeparture]
    FROM ReservationStayDate
   GROUP BY ReservationStayID, datename(m,StayDate) + ' ' +  cast(datepart(yyyy,StayDate) as varchar)
 ) x ON x.ReservationStayID = b.ReservationStayID



  LEFT JOIN
 (
 SELECT 
         FOC_ACCOUNT,
         datename(m,FOC_DATE) + ' ' + cast(datepart(yyyy,FOC_DATE) as varchar) as [FOCMTH], 

        SUM(case FOC_TRANSACTIONCODE when 'XBEV01' then foc_netamount else 0 end) as 'NetAmount(XBEV01)',
        SUM(case FOC_TRANSACTIONCODE when 'XBEV02' then foc_netamount else 0 end) as 'NetAmount(XBEV02)',
        SUM(case FOC_TRANSACTIONCODE when 'XBEV03' then foc_netamount else 0 end) as 'NetAmount(XBEV03)'
        SUM(case FOC_TRANSACTIONCODE when 'XFOOD1' then foc_netamount else 0 end) as 'NetAmount(XFOOD1)',
        SUM(case FOC_TRANSACTIONCODE when 'XFOOD2' then foc_netamount else 0 end) as 'NetAmount(XFOOD2)'

 FROM P5FOLIOCHARGE

 GROUP BY FOC_ACCOUNT, datename(m,FOC_DATE) + ' ' + cast(datepart(yyyy,FOC_DATE) as varchar)

) y ON y.FOC_ACCOUNT = j.FOH_ACCOUNT
更新: 下面是我的Pivot查询,它基于建议的解决方案,非常有用,并且可以正常工作。我创建了一个视图表HOLDINGS3,并进行了一个透视查询以进入视图:

    (SELECT ReservationStayID,
            PropertyCode,
            [Beverage Charge],
            [Food Charge]

    FROM (SELECT 
          ReservationStayID,
          PropertyCode,
          RevenueType,
          FOC_NETAMOUNT

      FROM HOLDINGS3

    )ab

      PIVOT (SUM(foc_netamount)

      FOR RevenueType IN ([Beverage Charge], [Food Charge]
         )) as pvt)

我们开始吧。您的查询很长,所以这可能不起作用,但希望它能给您一个想法。本节阻碍了您:

SELECT 
         FOC_ACCOUNT,
         datename(m,FOC_DATE) + ' ' + cast(datepart(yyyy,FOC_DATE) as varchar) as [FOCMTH], 

        SUM(case FOC_TRANSACTIONCODE when 'XBEV01' then foc_netamount else 0 end) as 'NetAmount(XBEV01)',
        SUM(case FOC_TRANSACTIONCODE when 'XBEV02' then foc_netamount else 0 end) as 'NetAmount(XBEV02)',
        SUM(case FOC_TRANSACTIONCODE when 'XBEV03' then foc_netamount else 0 end) as 'NetAmount(XBEV03)'
        SUM(case FOC_TRANSACTIONCODE when 'XFOOD1' then foc_netamount else 0 end) as 'NetAmount(XFOOD1)',
        SUM(case FOC_TRANSACTIONCODE when 'XFOOD2' then foc_netamount else 0 end) as 'NetAmount(XFOOD2)'
您最好只在表上左键连接,在新的extras表上左键连接,然后旋转出所需的列

USE MyDatabase
SELECT <<ALL THE DESCRIPTIVE COLUMNS YOU NEED>>,
[Beverage Charge],
[Food Charge]
FROM
(
SELECT 
  x.[ReservationStayID],
  b.PropertyCode,
  c.PMSConfirmationNumber,
  j.FOH_PMSCONFIRMATIONNUMBER,
  y.FOC_ACCOUNT,
   .......  
  b.GuestCount AS 'Total Guest',
  x.[Nights Spent] AS 'Room Nights',
  x.[MTH],
  x.[Rate] AS 'Room Rate WITH VAT',
  c.CurrencyCode, --added
  h.ROE AS 'Rate of Exchange', 
  (x.[Nights Spent]*x.[Rate]*h.[ROE])/NULLIF(1.15,0) AS 'PkgRevenue, Excl. VAT', 
  ((x.[Nights Spent]*x.[Rate]*h.[ROE])/1.15)/NULLIF((b.GuestCount*x.[Nights Spent]),0) AS 'GADR, Excl. VAT', 
  x.CreatedOn,
  x.[DateOfArrival],
  x.[DateOfDeparture],

  e.TravelAgencyTypeCode AS 'Source of Business', 
  c.TAProfileID, 
  e.Name AS 'Tour Operator',
  g.CountryGroup AS 'Market',
  c.TAProfileID2, --added
  e2.Name AS 'Booking Origin (1)', 
  g2.CountryGroup AS 'Booking Origin (2)',
  RevenueType,
  foc_netamount


  FROM GuestNameInfo a
  JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
  LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
  LEFT JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID 
  LEFT JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID 
  LEFT JOIN Market g ON e.CountryCode = g.CountryCode --added
  LEFT JOIN TravelAgency e2 ON e2.TravelAgencyID = c.TAProfileID2
  LEFT JOIN Market g2 ON e2.CountryCode = g2.CountryCode --added
  LEFT JOIN Exrate h ON h.Ccode = c.CurrencyCode -- added
  LEFT JOIN RoomCat i ON b.PropertyCode = i.Property AND d.rsl_roomtype = i.RoomType 
  LEFT JOIN P5FOLIOHEADER j ON J.FOH_PMSCONFIRMATIONNUMBER =    C.PMSConfirmationNumber


 LEFT JOIN
 (
   SELECT 
     ReservationStayID,
     datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) as [MTH],
     count(*) AS [Nights Spent],
     avg(RateAmount) as [Rate],
     min(CreatedOn) as CreatedOn,
     min(StayDate) as [DateOfArrival],
     max(StayDate) as [DateOfDeparture]
    FROM ReservationStayDate
   GROUP BY ReservationStayID, datename(m,StayDate) + ' ' +  cast(datepart(yyyy,StayDate) as varchar)
 ) x ON x.ReservationStayID = b.ReservationStayID

LEFT JOIN PSFOLIOCHARGE
    ON PSFOLIOCHARGE.FOC_ACCOUNT = j.FOH_ACCOUNT

LEFT JOIN Extras 
    on Extras.Code = PSFOLIOCHARGE.FOC_TRANSACTION_CODE
)vals
PIVOT ( SUM( foc_netamount) FOR (RevenueType IN([Beverage Charge],[Food Charge]) AS pvt
如果在没有修改数据库的情况下运行它,我会感到非常惊讶,因为除了重新创建表之外,我无法对它进行测试,但它应该会让您知道如何继续