簡體   English   中英

case 語句末尾的數學忽略了 case 語句 SQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM