【问题标题】:How can I use CASE expression in my query?如何在查询中使用 CASE 表达式?
【发布时间】:2019-08-24 18:59:11
【问题描述】:

当我想执行我的 case 语句时,它会显示一些错误。

我创建了一个人口统计查询。所以,我需要包含 case 语句。

SELECT DISTINCT
    'Age' DemographicGroup,
    CASE
        WHEN DATEDIFF(YY, DOB, @ReportDate) 25 THEN '=25' 
        WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 25 AND 35 THEN '26-35' 
        WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 36 AND 45 THEN '36-45' 
        WHEN DATEDIFF(YY, DOB, @ReportDate) 45 THEN '46+'
    END Label, 
    
    CASE
        WHEN DATEDIFF(YY, DOB, @ReportDate) 25 THEN 1 
        WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 25 AND 35 THEN 2 
        WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 36 AND 45 THEN 3 
        WHEN DATEDIFF(YY, DOB, @ReportDate) 45 THEN 4
    END GroupOrder
INTO
    #Demo2
FROM
    [dbo].[Dim_Borrower]

消息 102,第 15 级,状态 1,第 4 行
'25' 附近的语法不正确

消息 102,第 15 级,状态 1,第 7 行
“标签”附近的语法不正确

消息 102,第 15 级,状态 1,第 11 行
“GroupOrder”附近的语法不正确

【问题讨论】:

    标签: sql sql-server case


    【解决方案1】:

    您需要在WHEN 表达式中使用比较运算符。比如=<><>

    您还应该添加明确的ELSE 大小写以避免无意的NULL 输出:

    SELECT DISTINCT
        'Age' DemographicGroup,
        CASE
            WHEN DATEDIFF(YY, DOB, @ReportDate) = 25              THEN '=25' 
            WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 25 AND 35 THEN '26-35' 
            WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 36 AND 45 THEN '36-45' 
            WHEN DATEDIFF(YY, DOB, @ReportDate) > 45              THEN '46+'
            ELSE 'Unknown'
        END AS [Label], 
    
        CASE
            WHEN DATEDIFF(YY, DOB, @ReportDate) = 25              THEN 1 
            WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 25 AND 35 THEN 2 
            WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 36 AND 45 THEN 3 
            WHEN DATEDIFF(YY, DOB, @ReportDate) > 45              THEN 4
            ELSE 5
        END AS [GroupOrder]
    INTO
        #Demo2
    FROM
        [dbo].[Dim_Borrower]
    

    您可以通过使用内部查询并使用更简单的CASE xpr WHEN val 而不是更长形式的CASE WHEN expr 来简化此操作以减少重复代码。

    SELECT DISTINCT
        'Age' AS DemographicGroup,
        CASE q0.AgeGroup
            WHEN 1 THEN '=25' 
            WHEN 2 THEN '26-35' 
            WHEN 3 THEN '36-45' 
            WHEN 4 THEN '46+'
            ELSE 'Unknown'
        END AS [Label], 
        q0.AgeGroup AS [GroupOrder]
    INTO
        #Demo2
    FROM
        (
            SELECT
                'Age' AS DemographicGroup,
                CASE
                    WHEN DATEDIFF(YY, DOB, @ReportDate) = 25              THEN 1 
                    WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 25 AND 35 THEN 2 
                    WHEN DATEDIFF(YY, DOB, @ReportDate) BETWEEN 36 AND 45 THEN 3 
                    WHEN DATEDIFF(YY, DOB, @ReportDate) > 45              THEN 4
                    ELSE 5
                END AS AgeGroup
            FROM
                [dbo].[Dim_Borrower]
        ) AS q0
    
    
    

    【讨论】:

      【解决方案2】:

      APPLY 的案例。你也不需要 BETWEEN 因为 CASE Evaluates, in the order specified, Boolean_expression for each WHEN clause

      SELECT DISTINCT
          'Age' DemographicGroup,
          CASE g.[GroupOrder]
              WHEN 1 THEN '=25' 
              WHEN 2 THEN '26-35' 
              WHEN 3 THEN '36-45' 
              WHEN 4 THEN '46+'
              ELSE 'Unknown'
          END AS [Label], 
          g.[GroupOrder]
      INTO
          #Demo2
      FROM
          [dbo].[Dim_Borrower]
      CROSS APPLY (
         SELECT CASE
              WHEN DATEDIFF(YY, DOB, @ReportDate) = 25  THEN 1 
              WHEN DATEDIFF(YY, DOB, @ReportDate) <= 35 THEN 2 
              WHEN DATEDIFF(YY, DOB, @ReportDate) <= 45 THEN 3 
              WHEN DATEDIFF(YY, DOB, @ReportDate) > 45  THEN 4
              ELSE 5
          END AS [GroupOrder]
      ) g
      

      【讨论】:

        【解决方案3】:

        我很困惑为什么你指的是任何表格。为什么不直接使用包含所需值的派生表?

        select 'Age' as DemographicGroup,
        into #Demo2
        from (values (1, '=25'),
                     (2, '26-35'),
                     (3, '36-45'),
                     (4, '46+')
             ) v(Label, GroupOrder);
        

        这确保所有值都进入表中,无论Dim_Borrower 是否有它们。

        我还将包括年龄范围的下限和上限,以便我可以 join 将此添加到其他数据:

        select 'Age' as DemographicGroup,
        into #Demo2
        from (values (1, '=25', 25, 25),
                     (2, '26-35', 26, 35),
                     (3, '36-45', 36, 45),
                     (4, '46+', 46, NULL)
             ) v(Label, GroupOrder, LowerAge, UpperAge);
        

        【讨论】:

        • 感谢您的帮助。我真的很感谢你们。
        猜你喜欢
        • 2019-08-18
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多