[英]Math at the end of case statements is ignoring the case statements SQL
SELECT
A.a_id,
A.a_q1,
CASE
WHEN A.a_q2 = 5 then 1
WHEN A.a_q2 = 4 then 2
WHEN A.a_q2 = 3 then 3
WHEN A.a_q2 = 2 then 4
WHEN A.a_q2 = 1 then 5
else A.a_q2 end as a_q2, a_q3,
CASE
WHEN A.a_q4 = 5 then 1
WHEN A.a_q4 = 4 then 2
WHEN A.a_q4 = 3 then 3
WHEN A.a_q4 = 2 then 4
WHEN A.a_q4 = 1 then 5
else A.a_q4 end as a_q4, a_q5,
(a_q1 + a_q3 + a_q4 + a_q5)/4 AS "construct_1",
(a_q1 + a_q2 + a_q3 + a_q4)/4 AS "construct_2"
FROM ANSWERS A
我的輸出:
援助 | 構造_1 | 構造_2 |
---|---|---|
1 | 2.5000 | 3.5000 |
2 | 4.0000 | 3.2500 |
3 | 2.0000 | 2.7500 |
4 | 2.5000 | 3.5000 |
5 | 2.0000 | 2.7500 |
6 | 4.0000 | 3.2500 |
預期輸出:
援助 | 構造_1 | 構造_2 |
---|---|---|
1 | 3.5000 | 3.50000 |
2 | 3.0000 | 3.25000 |
3 | 3.5000 | 2.7500 |
4 | 1.5000 | 1.5000 |
5 | 3.0000 | 3.2500 |
6 | 4.0000 | 3.7500 |
數據集:
援助 | q_1 | q_2 | q_3 | q_4 | q_5 |
---|---|---|---|---|---|
1 | 4 | 5 | 4 | 1 | 1 |
2 | 4 | 1 | 3 | 5 | 4 |
3 | 4 | 5 | 1 | 1 | 4 |
4 | 3 | 5 | 1 | 5 | 1 |
5 | 3 | 4 | 3 | 1 | 1 |
6 | 5 | 2 | 3 | 3 | 5 |
我是 SQL 的新手,在從 case 語句創建列時遇到了麻煩。 最后的數學不是用 case 語句中的任何更新的數字進行計算。
最后的數學不是用 case 語句中的任何更新的數字進行計算。
SQL 不是這樣工作的。 SELECT
列表中的所有內容都是一個獨立的語句,適用於來自FROM[/WHERE[/GROUP]]
。 它不像編程語言那樣是“逐行修改自己的已執行代碼的自上而下的列表”
SELECT
name,
CONCAT(name, 'hello') as name,
name
FROM
person
將產生:
Name Name Name
John Johnhello John
中間的CONCAT(name, 'hello') as name
不會重新定義一些名為name
變量 / 對 select 中其他任何地方的name
任何其他使用沒有影響
如果你想要a_q4
在這個:
(a_q1 + a_q3 + a_q4 + a_q5)/4 AS "construct_1",
表現得像這樣:
CASE
WHEN A.a_q4 = 5 then 1
WHEN A.a_q4 = 4 then 2
WHEN A.a_q4 = 3 then 3
WHEN A.a_q4 = 2 then 4
WHEN A.a_q4 = 1 then 5
else A.a_q4 end
然后你必須把所有這些都放入計算中
(a_q1 + a_q3 +
CASE
WHEN A.a_q4 = 5 then 1
WHEN A.a_q4 = 4 then 2
WHEN A.a_q4 = 3 then 3
WHEN A.a_q4 = 2 then 4
WHEN A.a_q4 = 1 then 5
else A.a_q4 end
+ a_q5)/4 AS "construct_1",
或者您使用子查詢(或 CTE)來重新定義a_q4
含義。 老實說,您最好使用不同的名稱,以免混淆:
SELECT
(a_q1 + a_q3 + adjusted_a_q4 + a_q5)/4 AS "construct_1", --use the different name
...
FROM
(
SELECT
...
CASE
WHEN A.a_q4 = 5 then 1
WHEN A.a_q4 = 4 then 2
WHEN A.a_q4 = 3 then 3
WHEN A.a_q4 = 2 then 4
WHEN A.a_q4 = 1 then 5
else A.a_q4 end as adjusted_a_q4, --alias it using a different name
...
FROM ANSWERS A
) x
ps; 您的情況當 block 實際上與CASE WHEN A.a_q4 BETWEEN 1 AND 5 THEN 6 - a.a_q4 ELSE a_q4 END
,如果不會有 else,只需執行6-a_q4
(這會讓您巧妙地跳過子查詢,因為它可以插入到原始計算中)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.