Sql server 使用用户定义的变量将MySQL转换为TSQL
我不熟悉使用SQL Server,我正在尝试将此查询转换为可以在SQL Server中使用的内容。我一直在谷歌上寻找合适的结构,但我似乎根本看不到任何涉及“用户定义变量”的内容 任何帮助都将不胜感激 概述我正在努力实现的目标 我有6列,我需要得到6列的中位数,但只有在至少有4个响应的情况下。字段中的可能值为1-5,0为非响应Sql server 使用用户定义的变量将MySQL转换为TSQL,sql-server,tsql,variables,user-defined,Sql Server,Tsql,Variables,User Defined,我不熟悉使用SQL Server,我正在尝试将此查询转换为可以在SQL Server中使用的内容。我一直在谷歌上寻找合适的结构,但我似乎根本看不到任何涉及“用户定义变量”的内容 任何帮助都将不胜感激 概述我正在努力实现的目标 我有6列,我需要得到6列的中位数,但只有在至少有4个响应的情况下。字段中的可能值为1-5,0为非响应 SELECT GCAID, @countOfValuesGSS1 := ( CASE WHEN CEQ106 BET
SELECT
GCAID,
@countOfValuesGSS1 := (
CASE
WHEN CEQ106 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE
WHEN CEQ114 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE
WHEN CEQ123 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE
WHEN CEQ132 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE
WHEN CEQ142 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ143 BETWEEN 1 AND 5 THEN 1 ELSE 0 END),
@sumOfValuesGSS1 := (
CASE
WHEN CEQ106 BETWEEN 1 AND 5 THEN CEQ106 ELSE 0 END +
CASE
WHEN CEQ114 BETWEEN 1 AND 5 THEN CEQ114 ELSE 0 END +
CASE
WHEN CEQ123 BETWEEN 1 AND 5 THEN CEQ123 ELSE 0 END +
CASE
WHEN CEQ132 BETWEEN 1 AND 5 THEN CEQ132 ELSE 0 END +
CASE
WHEN CEQ142 BETWEEN 1 AND 5 THEN CEQ142 ELSE 0 END +
CASE
WHEN CEQ143 BETWEEN 1 AND 5 THEN CEQ143 ELSE 0 END),
if(@countOfValuesGSS1 >= 4, ROUND((@sumOfValuesGSS1/@countOfValuesGSS1),2), NULL) AS b_GSSMAJ1,
MAJ1,
FROM
v_ags_all
SQL Server不支持相同类型的内联变量概念,但它支持另一个名为的构造,该构造只需对原始查询进行少量更改:
;WITH cte AS
(
SELECT GCAID,
(
CASE WHEN CEQ106 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ114 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ123 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ132 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ142 BETWEEN 1 AND 5 THEN 1 ELSE 0 END +
CASE WHEN CEQ143 BETWEEN 1 AND 5 THEN 1 ELSE 0 END
) AS countOfValuesGSS1,
(
CASE WHEN CEQ106 BETWEEN 1 AND 5 THEN CEQ106 ELSE 0 END +
CASE WHEN CEQ114 BETWEEN 1 AND 5 THEN CEQ114 ELSE 0 END +
CASE WHEN CEQ123 BETWEEN 1 AND 5 THEN CEQ123 ELSE 0 END +
CASE WHEN CEQ132 BETWEEN 1 AND 5 THEN CEQ132 ELSE 0 END +
CASE WHEN CEQ142 BETWEEN 1 AND 5 THEN CEQ142 ELSE 0 END +
CASE WHEN CEQ143 BETWEEN 1 AND 5 THEN CEQ143 ELSE 0 END
) AS sumOfValuesGSS1,
MAJ1
FROM v_ags_all
)
SELECT GCAID,
CASE WHEN countOfValuesGSS1 >= 4 THEN
ROUND(sumOfValuesGSS1 / countOfValuesGSS1, 2)
END AS b_GSSMAJ1,
MAJ1
FROM cte;
CTE基本上充当动态视图。它们允许你做和你提供的一样的事情,尽管有点冗长
另一个小改动是将内联IF语句转换为CASE语句。而不是@countOfValuesGSS1:=使用countOfValuesGSS1并将IF替换为CASE语句p