【问题标题】:Join Multiple Sql statements from the same table连接同一张表中的多个 Sql 语句
【发布时间】:2018-08-30 09:43:52
【问题描述】:

我已经阅读了很多关于这个主题的帖子,但我还不满意。

我有一个名为ticket 的表格,其中包含以下列

TicketID | AirlineID | PassengerID | TicketPrice | TicketVolume | DestinationCountry | ExitCountry | TicketDate`

我有多个类似的查询

SELECT AVG(TicketPrice) 
FROM ticket 
WHERE TicketPrice between 552 and 1302
AND AirlineID=1 
AND TicketDate between '2016-01-01' and '2016-12-31' 
GROUP BY TicketDate

SELECT AVG(TicketPrice) 
FROM ticket 
WHERE TicketPrice between 552 and 1302 
AND AirlineID=1 
AND TicketDate between '2017-01-01' and '2017-12-31' 
GROUP BY TicketDate

请问我怎样才能将这两个查询并排形成另一个表

+--------------------------------++-----------
| AirlineID || Average Ticket Price 2016/2017|
+--------------------------------++-----------

它们实际上是更多的查询。

【问题讨论】:

  • 你能用样本数据给出预期的结果吗?
  • 到目前为止这毫无意义。您选择 AirlineID=1。在您的结果中,您有一列 AirlineID。当然,它只会包含一个。然后按 TicketDate 分组,以便每个票日期获得一排。但是您的结果不包含 TicketDate 列,因此您会得到很多行,但不知道日期指的是什么。请澄清。
  • “它们实际上是更多的查询”。啊哈。这些查询是什么样的?相同,但年份不同?那么结果是什么样的呢?一年一栏?您是否事先知道哪些年份或这些年份取决于当前日期或表格中存在的年份?

标签: mysql sql database-design pivot relational-database


【解决方案1】:

如果要将结果合并到一个表中,请使用 UNION。

SELECT {...}
UNION
SELECT {...}

SELECT 语句必须返回相同的列

【讨论】:

  • 这会将两个平均值作为单独的,而不是列。
  • 当我尝试这个时,它把所有东西都放在同一列
【解决方案2】:

只需使用CASE 即可实现:

试试这个:

SELECT
    AirlineID,
    AVG(CASE WHEN TicketDate BETWEEN '2016-01-01' AND '2016-12-31' THEN TicketPrice END),
    AVG(CASE WHEN TicketDate BETWEEN '2017-01-01' AND '2017-12-31' THEN TicketPrice END) 
FROM ticket 
WHERE
    TicketPrice BETWEEN 552 AND 1302 AND
    AirlineID = 1 
GROUP BY
    AirlineID, TicketDate;

【讨论】:

  • 感谢@DineshDB,但我也将 AirlineID 作为一列返回,因为我最多有 6 个 AirlineID。当我尝试您的查询时,它只返回案例列
  • 我试了一下,添加了AirlineIDs之间来得到我的结果。
【解决方案3】:

SQL

 SELECT 
 (SELECT AVG(TicketPrice) FROM ticket 
    WHERE TicketPrice between 552 and 1302
    AND AirlineID=1 
    AND TicketDate between '2016-01-01' and '2016-12-31' 
    GROUP BY TicketDate) as Col1,
(SELECT AVG(TicketPrice) FROM ticket 
    WHERE TicketPrice between 552 and 1302 
    AND AirlineID=1 
    AND TicketDate between '2017-01-01' and '2017-12-31' 
    GROUP BY TicketDate) as Col2

【讨论】:

  • ERROR 1242 (21000):子查询返回超过 1 行
【解决方案4】:

这是我的解决方案,可能不是 OP 想要的输出,但在我看来更好的输出,也不需要硬编码的日期

SELECT AirlineID, extract(YEAR from TicketDate) as year, AVG(TicketPrice)
FROM ticket
WHERE TicketPrice between 552 and 1302
GROUP BY AirLineID, year

【讨论】:

  • 被投诉的团体条款
  • 在 MariaDb 上不适合我,您尝试使用什么数据库?如果这个词有问题,可以将 year 更改为其他内容,例如 avg_year。
  • 每年您都在选择平均票价和任意选择的航空公司 ID。根据设置 MySQL 可能允许或不允许。您可能必须使用ANY_VALUE(AirlineID) 来实现这一点。但是:这真的是您的意图还是您在查询中犯了错误?也许您希望 AirlineID 出现在 GROUP BY 子句中。
  • @ThorstenKettner,是的,我在我的小组中忘记了航空公司。谢谢。
  • @ThorstenKettner,你指的是this setting discussed here吗?
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2017-07-17
  • 2016-11-27
  • 2018-12-16
  • 1970-01-01
  • 2015-05-18
  • 2015-07-24
相关资源
最近更新 更多