我正在将一个查询从SQL Server移动到Snowflake。查询的一部分创建了一个数据透视表。数据透视表部分运行良好(我已经单独运行了它,它提取了我期望的数字(。
但是,查询的以下部分依赖于透视表,而这些部分会失败。有些字段以字符串类型返回。我认为问题是Snowflake在将字符串数据转换为数字数据时遇到了问题。我试过CAST、TRY_TO_DUBLE/NUMBER,但这些都是0。
我将把代码放在下面,我很感激任何关于我能做什么的见解!
CREATE OR REPLACE TEMP TABLE ATTR_PIVOT_MONTHLY_RATES AS (
SELECT
Market,
Coverage_Mo,
ZEROIFNULL(TRY_TO_DOUBLE('Starting Membership')) AS Starting_Membership,
ZEROIFNULL(TRY_TO_DOUBLE('Member Adds')) AS Member_Adds,
ZEROIFNULL(TRY_TO_DOUBLE('Member Attrition')) AS Member_Attrition,
((ZEROIFNULL(CAST('Starting Membership' AS FLOAT))
+ ZEROIFNULL(CAST('Member Adds' AS FLOAT))
+ ZEROIFNULL(CAST('Member Attrition' AS FLOAT)))-ZEROIFNULL(CAST('Starting Membership' AS FLOAT)))
/ZEROIFNULL(CAST('Starting Membership' AS FLOAT)) AS "% Change"
FROM
(SELECT * FROM ATTR_PIVOT
WHERE 'Starting Membership' IS NOT NULL) PT)
我意识到这是一个非常大的问题,有很多运动部件。。。所以我的主要问题是:我如何才能成功地将数据类型更改为数值,从而使公式在查询的后半部分起作用?
非常感谢您通读这一切!
编辑以使用不需要的语法缩短查询
CAST((、TRY_TO_DOUBLE((和TRY_TO_NUMBER((。我还将字段(Starting Membership,Member Adds(放在单引号和双引号中。
除非出于某种原因在本文中引用字段名只是为了突出显示它们,否则编写此查询的方式将表明您试图将字符串值强制转换为数字。
例如:
ZEROIFNULL(TRY_TO_DOUBLE('Starting Membership'))
这只是试图将字符串文字值Starting Membership
强制转换为双精度。这将始终为NULL。然后你的ZEROIFNULL()
函数将你的NULL变成0(零(。
如果没有看到定义列名的查询的其余部分,我就无法为您提供更正,但请尝试在查询中使用字段名,而不是带引号的字符串值,看看这是否能满足您的需要。
您的第一个错误是所有单引号列名都被视为字符串/text/char
示例您的内部选择:
with ATTR_PIVOT(id, studentname) as (
select * from values
(1, 'student_a'),
(1, 'student_b'),
(1, 'student_c'),
(2, 'student_z'),
(2, 'student_a')
)
SELECT *
FROM ATTR_PIVOT
WHERE 'Starting Membership' IS NOT NULL
不存在";开始会员资格";列,然后我们得到所有的行。。
ID | 学生姓名 |
---|---|
1 | student_a |
1 | student_b |
1 | student_c |
2 | student_z |
2 | student_a |