如何在查询中使用CASE表达式?

时间:2019-08-24 06:37:30

标签: sql sql-server 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]
  

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

     

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

     

第15级州立1行11的消息102
  'GroupOrder'附近的语法不正确

3 个答案:

答案 0 :(得分:1)

您需要在n表达式中使用比较运算符。像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

答案 1 :(得分:1)

申请的情况。另外,您不需要之间,因为案例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

答案 2 :(得分:0)

我很困惑为什么您完全引用任何表。为什么不只使用带有所需值的派生表?

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);
相关问题