【问题标题】:Converting MS SQL to Snowflake SQL, How do I return a count of records using a subquery将 MS SQL 转换为 Snowflake SQL,如何使用子查询返回记录计数
【发布时间】:2021-05-01 21:34:18
【问题描述】:

我正在将查询从 MS SQL 转换为 Snowflake SQL,我想知道如何使用子查询(或等效于 Snowflake)来转换记录数。在下面的代码中,“NUM_VISITS”返回每位患者的遭遇次数。

如果我硬编码一个静态数字来代替“NUM_VISITS”,则查询不会出现问题,因此我确信问题在于我如何调用子查询。运行显示的代码时,出现以下错误:

SQL 编译错误:第 15 行的第 20 位语法错误出现意外的“SELECT”。位置 32 处的第 15 行语法错误意外'('。

SELECT
    
    'HB' as "TXN_SOURCE",
    enc.PAT_ID,
    enc.PAT_ENC_CSN_ID,
    enc.contact_date,
    enc.PRIMARY_LOC_ID,
    enc.department_id,
    CASE
        WHEN enc.DEPARTMENT_ID = 1229296 AND txn.PROC_ID = 12255396 THEN 'YES'
        ELSE 'NO'
    END as "KITCHEN_CLASS",
    "NUM_VISITS" = (SELECT COUNT(enc2.contact_date)
                    FROM HI_DB.STG_EPICCLARITY_PHS.PAT_ENC enc2
                    JOIN HI_DB.STG_EPICCLARITY_PHS.HSP_TRANSACTIONS txn2
                        ON enc2.PAT_ENC_CSN_ID = txn2.PAT_ENC_CSN_ID
                    WHERE enc.pat_id = enc2.pat_id
                            enc2.CONTACT_DATE BETWEEN $StartDate AND $EndDate
                            AND txn2.PROC_ID IN (12255387,12255388,12255395,12255396)
                            AND enc2.SERV_AREA_ID = 12288)
             ,
    txn.PROC_ID
    
FROM HI_DB.STG_EPICCLARITY_PHS.PAT_ENC enc
JOIN HI_DB.STG_EPICCLARITY_PHS.HSP_TRANSACTIONS txn
    ON enc.PAT_ENC_CSN_ID = txn.PAT_ENC_CSN_ID

WHERE enc.CONTACT_DATE BETWEEN $StartDate AND $EndDate
AND txn.PROC_ID IN (12255387,12255388,12255395,12255396)
AND enc.SERV_AREA_ID = 12288;

在解决了所指出的语法问题后,我能够通过从 JOIN 调用子查询来使代码正常工作。以下是功能代码:

SELECT
    
    'HB' as "TXN_SOURCE",
    enc.PAT_ID,
    enc.PAT_ENC_CSN_ID,
    enc.contact_date,
    enc.PRIMARY_LOC_ID,
    enc.department_id,
    CASE
        WHEN enc.DEPARTMENT_ID = 1229296 AND txn.PROC_ID = 12255396 THEN 'YES'
        ELSE 'NO'
    END as "KITCHEN_CLASS",
    cnt.COUNT,
    txn.PROC_ID
    
FROM HI_DB.STG_EPICCLARITY_PHS.PAT_ENC enc
JOIN HI_DB.STG_EPICCLARITY_PHS.HSP_TRANSACTIONS txn
    ON enc.PAT_ENC_CSN_ID = txn.PAT_ENC_CSN_ID
LEFT JOIN (SELECT   enc2.PAT_ID,
                    COUNT(enc2.contact_date) as "COUNT"
           FROM HI_DB.STG_EPICCLARITY_PHS.PAT_ENC enc2
           JOIN HI_DB.STG_EPICCLARITY_PHS.HSP_TRANSACTIONS txn2
                ON enc2.PAT_ENC_CSN_ID = txn2.PAT_ENC_CSN_ID
           WHERE enc2.CONTACT_DATE BETWEEN $StartDate AND $EndDate
                AND txn2.PROC_ID IN (12255387,12255388,12255395,12255396)
                AND enc2.SERV_AREA_ID = 12288
          GROUP BY enc2.PAT_ID) as cnt ON enc.PAT_ID = cnt.PAT_ID

WHERE enc.CONTACT_DATE BETWEEN $StartDate AND $EndDate
AND txn.PROC_ID IN (12255387,12255388,12255395,12255396)
AND enc.SERV_AREA_ID = 12288;

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    这是问题中查询的简化:

    SELECT x, 
        1 = (SELECT COUNT(1)
                        FROM (select 1 x)
                        WHERE x = 1
                                x BETWEEN 1 AND 5
                                AND x IN (1)
                                AND x = 1)
                 ,
        x 
    FROM (select 1 x)
    

    您可以看到显示的查询永远不会运行,因为它至少缺少一个AND

    要修复查询,只需在 BETWEEN 行之前添加一个 AND

    SELECT x, 1=(select 1),
        1 = (SELECT COUNT(1)
                        FROM (select 1 x)
                        WHERE x = 1
                                AND x BETWEEN 1 AND 5
                                AND x IN (1)
                                AND x = 1)
                 ,    x   
    FROM (select 1 x);
    

    【讨论】:

    • 感谢您的回复。我添加了 AND,当我运行代码时,出现“SQL 编译错误:错误第 15 行,位置 4 无效标识符 'NUM_VISITS'”错误。在 "NUM_VISITS" 周围加上双引号会产生相同的错误。所以我在'NUM_VISITS'周围加上了单引号,我得到了这个错误:SQL编译错误:表达式类型与列数据类型不匹配,期望NUMBER(38,0)但得到了NUM_VISITS列的BOOLEAN。我尝试了 CAST(COUNT(enc2.contact_date) as INTEGER) 以及将 SELECT 语句本身包装在 CAST 语句中,都导致了相同的数据不匹配错误
    • 我相信我找到了问题所在。我没有从 SELECT 语句中调用子查询,而是使用 LEFT JOIN 将子查询连接到主查询,这是返回数据。我仍然需要验证,但初始数据是我希望看到的。我是 Stack Overflow 的新手,我应该发布我的工作代码作为答案吗?
    • 我很高兴你能解决它@roneil1967!最佳 Stack Overflow 做法是投票赞成并接受其他人在对您有用时给您的答案。也可以随意编辑您的问题并添加固定的最终查询。
    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2020-12-28
    • 1970-01-01
    • 2021-02-19
    • 2016-04-24
    相关资源
    最近更新 更多