0

我是使用 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
4

1 回答 1

0

SQL Server 不支持相同类型的内联变量概念,但它支持另一种称为公用表表达式 (CTE)的构造,该构造只需对原始查询进行少量更改:

;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语句。

于 2014-09-29T22:51:44.077 回答