2016-11-17 98 views
1

对于大片段代码的道歉,但我需要显示它们以显示我已编译的相关调查。结合查询显示不正确的结果

下面我有两个单独的查询,从分期架构(Staging.SabreAssignedCrew)表和其他特定的飞行机组成员的一个检查是对数据的比较模式中的表,其中连接所有相关表格后,在一起,我得到每次飞行机组人员信息:


Staging.SabreAssignedCrew

SELECT 
* 
, Airline + CAST(FlightNumber AS VARCHAR) + Suffix AS StagingFlight 
, ROW_NUMBER() OVER(PARTITION BY Airline + CAST(FlightNumber AS VARCHAR) + Suffix ORDER BY UpdateId DESC) AS StageRowNumber 
FROM Staging.SabreAssignedCrew 
WHERE Airline + CAST(FlightNumber AS VARCHAR) + Suffix = 'LS627' AND DepartureDate = '2016-09-04' 

Data模式表

SELECT 
cd.CrewUpdateID 
, cd.IsPassive 
, cd.CrewBase 
, cd.CrewCategory 
, cd.CrewType 
, cd.EmployeeNumber 
, cd.FirstName 
, cd.LastName 
, c.UpdateID 
, c.LegKey 
, c.UpdateReceived 
, DataFlight 
, l.ScheduledDepartureDate 
, l.ScheduledDepartureAirport 
FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber FROM Data.Crew) c 
INNER JOIN 
Data.CrewDetail cd 
ON c.UpdateID = cd.CrewUpdateID 
AND cd.IsPassive = 0 
AND RowNumber = 1 
INNER JOIN 
(SELECT *, Carrier + CAST(FlightNumber AS VARCHAR) + Suffix AS DataFlight FROM Data.Leg) l 
ON c.LegKey = l.LegKey 
WHERE DataFlight = 'LS627' AND ScheduledDepartureDate = '2016-09-04' 

两个查询的结果显示,有6名机组人员(6行)在飞行:

enter image description here

现在我所要做的将查询合并为一个使用并执行SUM以确保正确的船员在航班上。然而,结果是不正确的,因为它下面outputd:

enter image description here

我们知道,在飞行6名机组人员,因此它应该显示为分期模式2 StagingCabinCrew和4 StagingCockpitCrew完全一样值为数据架构。这全由CrewType字段确定,这两个字段来自分段数据模式表。

我假设我在我的联合查询中做了一些错误,但我不确定它是如何在组合查询中单独运行上述两个查询来显示正确的结果,但执行整个组合查询显示错误值。什么需要解决?

WITH CTE AS (
SELECT 
cd.CrewUpdateID 
, cd.IsPassive 
, cd.CrewBase 
, cd.CrewCategory 
, cd.CrewType 
, cd.EmployeeNumber 
, cd.FirstName 
, cd.LastName 
, c.UpdateID 
, c.LegKey 
, c.UpdateReceived 
, DataFlight 
, l.ScheduledDepartureDate 
, l.ScheduledDepartureAirport 
FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber FROM Data.Crew) c 
INNER JOIN 
Data.CrewDetail cd 
ON c.UpdateID = cd.CrewUpdateID 
AND cd.IsPassive = 0 
AND RowNumber = 1 
INNER JOIN 
(SELECT *, Carrier + CAST(FlightNumber AS VARCHAR) + Suffix AS DataFlight FROM Data.Leg) l 
ON c.LegKey = l.LegKey 
WHERE DataFlight = 'LS627' AND ScheduledDepartureDate = '2016-09-04' 
) 
SELECT 
StagingFlight 
, sac.DepartureDate 
, sac.DepartureAirport 
, cte.DataFlight 
, cte.ScheduledDepartureDate 
, cte.ScheduledDepartureAirport 
, SUM(CASE WHEN sac.CREWTYPE = 'F' THEN 1 ELSE 0 END) AS StagingCabinCrew 
, SUM(CASE WHEN sac.CREWTYPE = 'C' THEN 1 ELSE 0 END) AS StagingCockpitCrew 
, SUM(CASE WHEN cte.CrewType = 'F' THEN 1 ELSE 0 END) AS DataCabinCrew 
, SUM(CASE WHEN cte.CrewType = 'C' THEN 1 ELSE 0 END) AS DataCockpitCrew 
FROM 
(
SELECT 
* 
, Airline + CAST(FlightNumber AS VARCHAR) + Suffix AS StagingFlight 
, ROW_NUMBER() OVER(PARTITION BY Airline + CAST(FlightNumber AS VARCHAR) + Suffix ORDER BY UpdateId DESC) AS StageRowNumber 
FROM Staging.SabreAssignedCrew-- 
WHERE Airline + CAST(FlightNumber AS VARCHAR) + Suffix = 'LS627' AND DepartureDate = '2016-09-04') 
sac 

LEFT JOIN CTE cte 
ON StagingFlight = DataFlight 
AND sac.DepartureDate = cte.ScheduledDepartureDate 
AND sac.DepartureAirport = cte.ScheduledDepartureAirport 
AND sac.CREWTYPE = cte.CrewType 
WHERE StagingFlight = 'LS627' AND DepartureDate = '2016-09-04' AND StageRowNumber = 1 

GROUP BY 
StagingFlight 
, sac.DepartureDate 
, sac.DepartureAirport 
, cte.DataFlight 
, cte.ScheduledDepartureDate 
, cte.ScheduledDepartureAirport 
+0

在begining试着让你的QRY更容易 - “航空+ CAST(FLIGHTNUMBER AS VARCHAR)+后缀”可以计算持久列 - 将更具可读性 - 由StagingFlight创建船员agregation(组出发日期,sac.DepartureAirport)到临时表或查看 - 你不需要在你的qry中使用row_number(group by will be enough) – Deadsheep39

+0

@ deadsheep39你想坚持你的评论作为答案,所以如果它的工作,我可以标记它?我知道如何做视图或临时表,但也可以包含一个供其他人看的例子。谢谢 – BruceyBandit

回答

0
  1. 创建stagingflight列(你可能会使用apropriete指数)。请始终设置varchar的大小(例如varchar - > varchar(30))。

    alter table staging.sabreassignedcrew 
    add stagingflight as cast(airline + cast(flightnumber as varchar(5)) + suffix as varchar(25)) persisted 
    
  2. 创建视图。

    CREATE VIEW Staging.vw_SabreAssignedCrewCount 
    AS 
    SELECT 
        StagingFlight, 
        DepartureDate, 
        COUNT(DISTINCT CASE WHEN sac.CREWTYPE = 'F' THEN EmployeeNumber END) AS StagingCabinCrewCnt, 
        COUNT(DISTINCT CASE WHEN sac.CREWTYPE = 'C' THEN EmployeeNumber END) AS StagingCockpitCrewCnt 
    FROM Staging.SabreAssignedCrew 
    GROUP BY StagingFlight, DepartureDate 
    

用于第二表中的第二视图。

  1. 你不需要rownumbers,CTE。只有轻松加入2个分组选择。
+0

感谢Deadsheep39为你的答案,遗憾的是我发现我有限制创建视图或更改表的权限,所以我将不得不现在使用CTE。在过去的两个小时里我一直试图把它整理出来,但仍然没有运气。您是否了解问题出在哪里,并且能够提供可能的修复程序的代码段? – BruceyBandit

+0

如果您没有创建视图的权限,请尝试是否可以创建临时表(#)。将第一个选择从组中选择插入到临时表和总览中,如果有您的预期结果 - 如果没有问题,请获取第二个选择并尝试总结每个部分的临时结果。 – Deadsheep39