Sql 组合查询会显示不正确的结果

Sql 组合查询会显示不正确的结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,很抱歉代码片段太多,但我需要显示它们以显示我编译的相关调查 下面我有两个单独的查询,一个是从暂存模式(staging.SabreAssignedCrew)表中检查特定航班中的机组成员,另一个是对数据模式表的比较,其中在将所有相关表连接在一起之后,每次飞行我都会得到机组人员信息: Staging.SabreAssignedCrew表格 SELECT * , Airline + CAST(FlightNumber AS VARCHAR) + Suffix AS StagingFlight ,

很抱歉代码片段太多,但我需要显示它们以显示我编译的相关调查

下面我有两个单独的查询,一个是从暂存模式(
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'

数据
架构表

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排):

现在,我要做的是将查询合并为一个查询,并执行求和,以确保航班上有正确的机组成员。但是,结果不正确,因为其输出如下:

我们知道飞行中有6名机组成员,因此它应该为暂存模式2
StagingCabinCrew
和4
StagingCockpitCrew
显示,并且为数据模式显示完全相同的值。这都是由
CrewType
字段从stagingdata模式表中确定的

我假设我在组合查询中做错了什么,但我不确定这是什么,因为在组合查询中分别运行上述两个查询会显示正确的结果,但执行整个组合查询会显示错误的值。需要修复什么

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
  • 为stagingflight创建列(您可能会使用适当的索引)。请始终设置varchar的大小(例如varchar-->varchar(30))

  • 创建视图

    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 
    
  • 第二个表的第二个视图

  • 你不需要行号,CTE。仅在2个分组选择上进行轻松联接
  • 为stagingflight创建列(您可能会使用适当的索引)。请始终设置varchar的大小(例如varchar-->varchar(30))

  • 创建视图

    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 
    
  • 第二个表的第二个视图

  • 你不需要行号,CTE。仅在2个分组选择上进行轻松联接

  • 在开始时,尽量使您的qry更容易-“Airline+CAST(FlightNumber为VARCHAR)+Suffix”可以计算为持久列-将更具可读性-为机组人员(按StagingFlight分组,sac.DepartureDate,sac.DepartureAirport)创建一个临时表或视图-您不需要qry中的行号(分组就足够了)@deadsheep39你想把你的评论作为一个答案,这样如果它起作用,我就可以标记它吗?我知道如何处理视图或临时表,但也可以包括一个示例供其他人查看。感谢Sat开始尝试让你的qry更容易-“航空公司+演员阵容(航班号为VARCHAR)+后缀”可以计算保留列-更具可读性-为机组(按StagingFlight分组,sac.DemoureDate,sac.DemoureAirport)创建临时表或视图-您不需要qry中的行号(分组即可)@deadsheep39你想把你的评论作为一个答案,这样如果它有效,我可以标记它吗?我知道如何创建视图或临时表,但也可以包括一个示例供其他人查看。感谢deadsheep39的回答,很遗憾,我发现我在创建视图或更改表时有权限受到限制,所以我现在必须使用CTEs。在过去的两个小时里,我一直在试图解决这个问题,但仍然没有成功。您是否知道问题所在,并能够提供可能的修复方法的代码片段?如果您没有创建视图的权限,请尝试创建临时表(#)。如果有您期望的结果,请将group by中的第一个选择插入临时表并进行概述-如果可以,请获取第二个选择,然后尝试对每个部分的临时结果进行概述。感谢Deadsheep39的回答,遗憾的是,我发现我在创建视图或更改表时有权限受到限制,因此我将不得不使用CTEsr现在。我在过去两个小时内一直试图解决这个问题,但仍然没有成功。您是否知道问题所在,并且能够提供可能的解决方案的代码片段?如果您没有创建视图的权限,请尝试是否可以创建临时表(#).将group by中的第一个选择插入临时表,并概述是否有您预期的结果-如果可以,请获取第二个选择,然后尝试概述每个部分的临时结果。