在命名的计算表达式中声明局部变量

时间:2019-02-08 19:59:56

标签: sql-server ssas sql-server-2017 calculated-field

我想为年龄创建一个命名计算字段,并且我想在类似以下表达式的内部声明一个局部变量,但它不起作用:

DECLARE
@age INT;

@age=DateDiff("yyyy",DATE_NAIS,getdate());

CASE WHEN @age<=10 THEN  1
WHEN @age>10 AND @age<=20 THEN 2
WHEN @age>20 AND @age<=35 THEN 3
ELSE 4
END

2 个答案:

答案 0 :(得分:1)

正确的是,您不能像试图那样在SELECT表达式的上下文中声明变量。

您有几种不同的选择,其中digital.aaron在他的评论中提供了一种选择。

另一种方法是在CTE中将其创建为人工列,然后从CTE中选择而不是在表格中进行选择:

WITH cte AS (SELECT *, DateDiff("yyyy",DATE_NAIS,getdate()) AS age FROM MyTable)
SELECT CASE 
  WHEN age<=10 THEN  1
  WHEN age>10 AND age<=20 THEN 2
  WHEN age>20 AND age<=35 THEN 3
  ELSE 4
END AS SomeColumn
FROM cte

答案 1 :(得分:1)

此问题带有SSAS标记,因此我猜您是在多维数据集中执行此操作?以下DAX公式将用作模型中计算所得的列,用于描述您的帖子中所描述的内容。如评论DATEDIFF所述,仅会返回当年与该人出生年份之间的差额,这就是为什么使用YEARFRAC来获取年份的分数,然后将其四舍五入的原因通过INT函数向下到最接近的整数。例如,一个50岁,364天大的人将被认为是50岁,而不是51岁。由于TRUE()SWITCH函数的第一个参数,因此它将评估每个条件,直到匹配为找到。

PersonAge:= 
    var Age = INT(YEARFRAC(YourTable[DATE_NAIS], TODAY()))

RETURN

SWITCH
    (TRUE(), 
    Age < 10, 1,
AND(
    Age > 10, 
    Age <= 20), 2,
AND(
    Age > 20, 
    Age <= 35), 3,
    4)