将Sql子查询与case语句一起使用时出现问题

将Sql子查询与case语句一起使用时出现问题,sql,sql-server,Sql,Sql Server,我在执行代码时遇到问题, 附近的语法不正确 我现在正在学习SQL,因此任何帮助都将不胜感激。问题不在于case表达式。子查询缺少表别名。此外,日期常量需要使用单引号: select Firstname,LastName,age, case when age < 40 and age >= 25 then 'Young' when age < 60 and age >= 40 then 'No More Young' when age &g

我在执行代码时遇到问题, 附近的语法不正确

我现在正在学习SQL,因此任何帮助都将不胜感激。

问题不在于case表达式。子查询缺少表别名。此外,日期常量需要使用单引号:

    select Firstname,LastName,age, case
    when age < 40 and age >= 25 then 'Young' 
    when age < 60 and age >= 40 then 'No More Young'
    when age >= 60 then 'Retired'
    else 'Dont Care'
    END as flag
    from (select FirstName,LastName,DATEDIFF(year,2018-08-26,BirthDate) as age from ContosoRetailDW.dbo.DimCustomer)
只映射了三个范围,这并不是一个很大的简化。

问题不在于大小写表达式。子查询缺少表别名。此外,日期常量需要使用单引号:

    select Firstname,LastName,age, case
    when age < 40 and age >= 25 then 'Young' 
    when age < 60 and age >= 40 then 'No More Young'
    when age >= 60 then 'Retired'
    else 'Dont Care'
    END as flag
    from (select FirstName,LastName,DATEDIFF(year,2018-08-26,BirthDate) as age from ContosoRetailDW.dbo.DimCustomer)

这并不是一个简单的问题,因为只映射了三个范围。

您应该在查询结束时添加为客户。原因是,每个子查询必须有一个别名。
如果其他所有内容都正确,我不确定此版本的DATEDIFF是否可以使用。

您应该在查询结束时添加为客户。原因是,每个子查询必须有一个别名。
如果其他所有内容都是正确的,我不确定这个版本的DATEDIFF是否可以使用。

正如前面指出的,原因是您的子查询没有别名,但您根本不需要在此处使用子查询。只需选择值。此外,您的case表达式可以大大简化。而且您的年龄计算不正确。正如前面指出的,原因是您的子查询没有别名,但您根本不需要子查询。只需选择值。此外,您的case表达式可以大大简化。你的年龄计算不正确。
select Firstname, LastName, age,
       (case when age >= 25  and age < 40 then 'Young' 
             when age < 60 then 'No More Young'
             when age >= 60 then 'Retired'
             else 'Dont Care'
        end) as flag
from (select FirstName, LastName, DATEDIFF(year, '2018-08-26', BirthDate) as age
      from ContosoRetailDW.dbo.DimCustomer
     ) c;