Sql server 使用用户定义的变量将MySQL转换为TSQL

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

我不熟悉使用SQL Server,我正在尝试将此查询转换为可以在SQL Server中使用的内容。我一直在谷歌上寻找合适的结构,但我似乎根本看不到任何涉及“用户定义变量”的内容

任何帮助都将不胜感激

概述我正在努力实现的目标

我有6列,我需要得到6列的中位数,但只有在至少有4个响应的情况下。字段中的可能值为1-5,0为非响应

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