【问题标题】:Calculate Passengers on each Destination计算每个目的地的乘客
【发布时间】:2019-11-28 17:27:55
【问题描述】:

我正在尝试计算前往每个目的地的乘客人数。这是一些示例代码,如果有帮助的话。

DDL:

CREATE TABLE #PAX
(
  FLIGHT_NO INT,
  SEG INT,
  DEP VARCHAR(3),
  ARR VARCHAR(3),
  First_Class INT,
  Economy INT
)

DML:

INSERT INTO #PAX(FLIGHT_NO, SEG, DEP, ARR, First_Class, Economy)
SELECT 220, 1, 'STL', 'JFK', 11, 166
UNION ALL
SELECT 220, 2, 'STL', 'DXB', 13, 21
UNION ALL
SELECT 220, 3, 'JFK', 'DXB', 11, 150;

我想知道有多少乘客飞往 JFK 和 DXB。

预期结果:

SELECT 'STL', 'JFK', 24, 187
UNION ALL
SELECT 'JFK', 'DXB', 24, 171

到目前为止我的尝试:

WITH CTE1 AS
(
SELECT DEP, SUM(First_Class) AS First_Class, SUM(Economy) AS Economy FROM #PAX GROUP BY DEP HAVING COUNT(DEP) > 1 
),
LEG2 AS
(
SELECT ARR, SUM(First_Class) AS First_Class, SUM(Economy) AS Economy FROM #PAX GROUP BY ARR HAVING COUNT(ARR) > 1
)
SELECT #PAX.DEP, #PAX.ARR, CTE1.DEP, LEG2.ARR, 
SUM(CTE1.First_Class) AS First_Class, SUM(CTE1.Economy) AS Economy
,SUM(LEG2.First_Class) AS First_Class, SUM(LEG2.Economy) AS Economy
FROM #PAX LEFT OUTER JOIN CTE1 ON #PAX.DEP = CTE1.DEP
LEFT OUTER JOIN LEG2 ON #PAX.ARR = LEG2.ARR
GROUP BY #PAX.DEP, #PAX.ARR
, CTE1.DEP, LEG2.ARR

【问题讨论】:

  • 您的数据库没有乘客级别的信息,因此您无法从汇总数据中确定这一点。
  • @GordonLinoff:我刚刚发布了一个示例。实际上,我正在加入另一个表格以获取乘客信息。
  • 那么你的尝试在哪里?
  • @DaleK 我现在已将我的尝试添加到原始帖子中。

标签: sql sql-server azure-sql-database azure-sqldw azure-sql-data-warehouse


【解决方案1】:

根据您提供的数据,您可以使用 GROUP BY 查询根据 ARR 列进行分组:

SELECT ARR, SUM(First_Class) AS 'TOTAL_FIRST_CLASS', 
       SUM(Economy) AS 'TOTAL_ECONOMY', 
       SUM(First_Class) + SUM(Economy) AS 'TOTAL_PASSENGER'
FROM #PAX
GROUP BY ARR

根据评论修改答案:

SELECT DEP, '' AS ARR, SUM(First_Class) AS 'TOTAL_FIRST_CLASS', SUM(Economy) AS 'TOTAL_ECONOMY', SUM(First_Class) + SUM(Economy) AS 'TOTAL_PASSENGER'
FROM #PAX
WHERE DEP NOT IN (SELECT DISTINCT(ARR) FROM #PAX)
GROUP BY DEP
UNION ALL
SELECT '' AS DEP, ARR, SUM(First_Class) AS 'TOTAL_FIRST_CLASS', SUM(Economy) AS 'TOTAL_ECONOMY', SUM(First_Class) + SUM(Economy) AS 'TOTAL_PASSENGER'
FROM #PAX
WHERE ARR NOT IN (SELECT DISTINCT(DEP) FROM #PAX)
GROUP BY ARR

在提供规则以确定特定的 DEP 和 ARR 列值之前,无法根据提供的样本数据和预期结果确定相同的值。

更新答案(基于提供的数据):

SELECT CASE 
        WHEN DEPCOL = '' THEN (SELECT DISTINCT(ARR) FROM #PAX WHERE ARR != ARRCOL )
        ELSE DEPCOL
       END as 'CALC_DEP',

       CASE 
        WHEN ARRCOL = '' THEN (SELECT DISTINCT(DEP) FROM #PAX WHERE DEP != DEPCOL ) 
        ELSE ARRCOL
       END as 'CALC_ARR',


       TOTAL_FIRST_CLASS, 
       TOTAL_ECONOMY
FROM
(
SELECT DEP as DEPCOL, '' AS ARRCOL, SUM(First_Class) AS 'TOTAL_FIRST_CLASS', SUM(Economy) AS 'TOTAL_ECONOMY', SUM(First_Class) + SUM(Economy) AS 'TOTAL_PASSENGER'
FROM #PAX
WHERE DEP NOT IN (SELECT DISTINCT(ARR) FROM #PAX)
GROUP BY DEP
UNION ALL
SELECT '' AS DEPCOL, ARR AS ARRCOL, SUM(First_Class) AS 'TOTAL_FIRST_CLASS', SUM(Economy) AS 'TOTAL_ECONOMY', SUM(First_Class) + SUM(Economy) AS 'TOTAL_PASSENGER'
FROM #PAX
WHERE ARR NOT IN (SELECT DISTINCT(DEP) FROM #PAX)
GROUP BY ARR
) AS tflight

【讨论】:

  • 抱歉,我的意思是有多少乘客从 STL 飞往 JFK 和 DXB 作为他们的最终目的地。就像有些乘客可能从 STL-JFK 飞下来,有些乘客坐在飞机上。而其他一些人则在肯尼迪国际机场登机并与 STL 乘客一起飞往 DXB。这有意义吗?
  • 更新了我的答案。
  • 谢谢@Angelo!如原帖所述,输出应包含 DEP 和 ARR 字段。
  • 您的 ARR 位置在技术上可以是 JFK 或 DXB。您有什么规则来确定对于结果查询,选定的 ARR 值是来自 STL 的航班是 JFK。与您的 DEP 列一样,技术上可能是 STL 或 JFK?
  • 这是确定它的航班号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2018-06-22
  • 1970-01-01
相关资源
最近更新 更多