【问题标题】:SQL Conditional column data return (on a tuple basis)SQL 条件列数据返回(基于元组)
【发布时间】:2022-11-19 11:43:56
【问题描述】:

我创建了一个 SQL 查询,它从满足两个条件之一的电影表中返回元素。它们要么是最赚钱的(总预算),要么是制作成本最低的电影。

但是,我想在查询的返回中添加一列,根据元组满足的条件来表示“最有利可图”或“最便宜”。我尝试在网上寻找解决方案;我决定尝试在查询的 SELECT 部分使用 CASE WHEN。

原始sql查询:

SELECT DISTINCT Films.title, Films.year
FROM Films,(SELECT DISTINCT (MAX(Films.gross-Films.budget))AS profit FROM Films)AS Temp1
WHERE ((Films.gross-Films.budget)=Temp1.profit) OR (Films.budget)=(SELECT DISTINCT Min(Films.budget) FROM Films)

CASE WHEN 尝试:

SELECT DISTINCT CASE WHEN Temp1.profit=Max(Temp1.profit) THEN 'most profitable' ELSE 'least expensive' END AS feature, Films.title, Films.year
FROM Films,(SELECT DISTINCT (MAX(Films.gross-Films.budget))AS profit FROM Films)AS Temp1
WHERE ((Films.gross-Films.budget)=Temp1.profit) OR (Films.budget)=(SELECT DISTINCT Min(Films.budget) FROM Films)

但是,这会出现各种错误,例如: “temp1.profit”列必须出现在 GROUP BY 子句中或用于聚合函数

我不确定为什么要问这个,但我还是尝试通过添加行来给它想要的东西

GROUP BY TEMP1.profit,Films.title,Films.year;

这使错误消失了,但现在所有行都对特征列获得了相同的“最有利可图”值,即使这不是它们存在的原因!

我不知道是否有任何方法可以使这项工作正常进行,但即使是一种完全不同的方法来使该专栏正常工作也会有很大帮助。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

您不能在 SELECT 子句中直接重用 WHERE 子句中的计算,但可以使用 WITH queries 或将 WHERE 子句移动到外部选择来获得此效果。在你的情况下,我认为结合这两种策略可以获得最干净的结果:

WITH max_profit AS (SELECT MAX(gross-budget) FROM Films),
min_cost AS (SELECT MIN(budget) FROM Films)
SELECT title, year, most_profitable, least_expensive FROM
  (SELECT 
      Films.title, Films.year, 
      (Films.gross-Films.budget = (SELECT * FROM max_profit)) AS most_profitable,
      (Films.budget = (SELECT * FROM min_cost)) AS least_expensive
   FROM Films
  )
  WHERE most_profitable OR least_expensive;

此处的输出与您尝试的稍有不同:它应该具有名为 most_profitable 和 least_expensive 的列,这些列设置为 true 或 false,并且始终至少有一个设置为 true。这对我来说似乎更好,因为也许同一部电影可能是最便宜和最赚钱的,但如果你愿意,你可以将你的案例陈述放回外部 SELECT 子句中:

WITH max_profit AS (SELECT MAX(gross-budget) FROM Films),
min_cost AS (SELECT MIN(budget) FROM Films)
SELECT title, year, (CASE WHEN most_profitable THEN 'most profitable' ELSE 'least expensive' END) FROM
  (SELECT 
      Films.title, Films.year, 
      (Films.gross-Films.budget = (SELECT * FROM max_profit)) AS most_profitable,
      (Films.budget = (SELECT * FROM min_cost)) AS least_expensive
   FROM Films
  )
  WHERE most_profitable OR least_expensive;

【讨论】:

  • 这很好,但我真的很想学习如何将这些信息放在一个列中。这可能是因为我对 sql 很陌生,但我不明白如何使用外部 WHERE 来做到这一点。可以展示给我吗?
  • 编辑以使其更清楚,希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多