当我要执行我的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'附近的语法不正确
答案 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);