我創建了一個 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;
這使錯誤消失了,但現在所有行都對特征列獲得了相同的“最有利可圖”值,即使這不是它們存在的原因!
我不知道是否有任何方法可以使這項作業正常進行,但即使是一種完全不同的方法來使該專欄正常作業也會有很大幫助。
uj5u.com熱心網友回復:
另一種選擇是在按利潤或錯誤排序后使用限制條款:
(
select *, 'most profitable'
from films
order by gross - budget desc
fetch first 1 rows with ties
)
union all
(
select *, 'least expensive'
from films
order by budget
fetch first 1 rows with ties
)
通常沒有必要用括號將聯合查詢括起來,但在這種情況下是必需的,因為我們必須單獨應用 ORDER BY 和限制。聯合所有
uj5u.com熱心網友回復:
您不能在 SELECT 子句中直接重用 WHERE 子句中的計算,但可以使用WITH 查詢或將 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。這對我來說似乎更好,因為也許同一部電影可能是最便宜和最賺錢的,但如果你愿意,你可以將你的 case 陳述句放回到外部 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;
uj5u.com熱心網友回復:
作為開始:您不需要在 films 表上使用這些多個子查詢來識別最有利可圖和最便宜的專案!你可以只使用視窗函式。這是一個按(減少)利潤和(增加)預算對所有電影進行排名的查詢:
select f.title, f.year,
row_number() (order by gross - budget desc) rn_profit,
row_number() (order by budget) rn_budget
from films f
然后我們可以將其轉換為子查詢并過濾我們想要的電影:
select *
from (
select f.title, f.year,
row_number() (order by gross - budget desc) rn_profit,
row_number() (order by budget) rn_budget
from films f
) f
where 1 in (rn_profit, rn_budget)
這給你兩行(如果一部電影在兩個類別中都名列前茅,則只有一行);columnrn_profit有 value的行1表示最賺錢的電影,而1in的值rn_budget表示較便宜的電影。case您可以根據需要在 select 子句的運算式中解釋此資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536542.html
下一篇:過濾陣列中的元素
