将 Oracle 查询转换为雪花

时间:2021-05-17 15:48:51

标签: sql snowflake-cloud-data-platform

需要一些帮助才能将以下 oracle 代码转换为 Snowflake。当我尝试这个时,遇到无效的标识符,rownum,

SELECT Customer_Id
    ,Release_type
    ,Customer_Name
    ,XYZ_Product_Name
    ,XYZ_Product_Salesforce_Number
    ,XYZ_Product_Code
    ,XYZ_Product_Type
    ,Brand_Family
    ,Qty_Purchased
    ,qty_u2dt
    ,sbc_Term_Start_Date
    ,sbc_Term_End_Date
    ,Months_Sold
    ,Months_Used
    ,Remaining_Months
    ,round(decode(Months_Sold, 0, 0, (Months_Used / Months_Sold) * 100), 2) AS Term_used_perc
    ,round(Actual_monthly_Usage, 2) AS Actual_monthly_Usage
    ,round((Actual_monthly_Usage * Remaining_Months) + qty_u2dt, 2) AS projected_usage
    ,round(decode(Qty_Purchased, 0, 0, (((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) / Qty_Purchased) * 100), 2) AS projected_usage_perc
    ,round((((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) - Qty_Purchased), 2) AS projected_over_under_usage
    ,CASE 
        WHEN round(decode(Qty_Purchased, 0, 0, (((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) / Qty_Purchased) * 100), 2) = 100
            AND Qty_Purchased = qty_u2dt
            THEN 'Resell'
        WHEN round(decode(Qty_Purchased, 0, 0, (((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) / Qty_Purchased) * 100), 2) < 100
            THEN 'Churn'
        WHEN round(decode(Qty_Purchased, 0, 0, (((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) / Qty_Purchased) * 100), 2) > 100
            THEN 'Upsell'
        WHEN round(decode(Qty_Purchased, 0, 0, (((Actual_monthly_Usage * Remaining_Months) + qty_u2dt) / Qty_Purchased) * 100), 2) = 100
            AND Qty_Purchased = (round((Actual_monthly_Usage * Remaining_Months) + qty_u2dt))
            THEN 'On Track'
        ELSE 'Unknown'
        END Projected_Indicator
    ,Timeline
    ,Contr_End_Date
    ,Salesforce_Account_Number
    ,Salesforce_csa_Id
    ,Salesforce_Contact
    ,Product_Family_Description
    ,Product_Family_Code
    ,Product_Brand_Description
    ,Product_Brand_Code
    ,Product_Category_Description
    ,Product_Category_Code
    ,Product_Name
    ,Product_Code
    ,product_type
    ,s_2_CUSTOMER_OWNER_NID
    ,G_Customer_Number
    ,G_Customer_Name
    ,G_Customer_Address
    ,G_Customer_City
    ,G_Customer_Country
    ,G_Customer_Phone
    ,G_Customer_State_Prov
    ,G_Customer_Zip_Code
    ,G_Customer_SFDC_NID
    ,G_Customer_SFDC_NID_Link
    ,s_2_Customer_Number
    ,s_2_Customer_Name
    ,s_2_Customer_Address
    ,s_2_Customer_City
    ,s_2_Customer_Country
    ,s_2_Customer_Phone
    ,s_2_Customer_State_Prov
    ,s_2_Customer_Zip_Code
    ,s_2_Customer_Health_Status
    ,s_2_Customer_SFDC_NID
    ,s_2_Customer_SFDC_NID_Link
    ,s_2_Customer_XYZ_NID
    ,s_2_Customer_XYZ_NID_Link
    ,s_2_Customer_Sales_Owner
    ,s_2_Customer_CSM
    ,s_2_Customer_CSM_Manager
    ,s_2_Customer_Sales_Manager
    ,s_2_customer_sales_team
    ,s_2_Customer_PSM
    ,s_2_Customer_PSM_Manager
    ,sbc_number
    ,sbc_status
    ,subscriptiontype
    ,sbc_start_date
    ,sbc_end_date
    ,sbc_termination_date
    ,sbc_SFDC_NID
    ,sbc_SFDC_NID_Link
    ,istestaccount
    ,child_sub_name
    ,parent_sub_name
    ,requiredbyid
    ,Parent_PRODUCTID
    ,parent_productname
    ,Initial_recurrinng_term
    ,Recurrinng_reolover_term
    ,renewal_date
    ,rate_set_uom
    ,Unit_of_Measure
    ,Contract_Number
    ,Contract_SFDC_NID
    ,Contract_SFDC_NID_Link
    ,Contract_Start_Date
    ,Contract_End_Date
FROM (
    SELECT Customer_Id
        ,Release_type
        ,Customer_Name
        --,Contract_Number
        ,XYZ_Product_Name
        ,XYZ_Product_Salesforce_Number
        ,XYZ_Product_Code
        ,XYZ_Product_Type
        ,Brand_Family
        ,Qty_Purchased
        ,qty_u2dt
        ,sbc_Term_Start_Date
        ,sbc_Term_End_Date
        ,round(months_between(sbc_Term_End_Date, sbc_Term_Start_Date), 2) AS Months_Sold
        ,round(months_between(current_date, sbc_Term_Start_Date), 2) AS Months_Used
        ,(round(months_between(sbc_Term_End_Date, sbc_Term_Start_Date), 2)) - (round(months_between(current_date, sbc_Term_Start_Date), 2)) AS Remaining_Months
        ,decode(months_between(current_date, sbc_Term_Start_Date), 0, 0, ((qty_u2dt / months_between(current_date, sbc_Term_Start_Date)))) AS Actual_monthly_Usage
        ,CASE 
            WHEN sbc_Term_End_Date < current_date
                THEN 'Past'
            WHEN sbc_Term_Start_Date > current_date
                THEN 'Future'
            ELSE 'Present'
            END Timeline
        ,Contr_End_Date
        ,Salesforce_Account_Number
        ,Salesforce_csa_Id
        ,Salesforce_Contact
        ,Product_Family_Description
        ,Product_Family_Code
        ,Product_Brand_Description
        ,Product_Brand_Code
        ,Product_Category_Description
        ,Product_Category_Code
        ,Product_Name
        ,Product_Code
        ,product_type
        ,s_2_CUSTOMER_OWNER_NID
        ,G_Customer_Number
        ,G_Customer_Name
        ,G_Customer_Address
        ,G_Customer_City
        ,G_Customer_Country
        ,G_Customer_Phone
        ,G_Customer_State_Prov
        ,G_Customer_Zip_Code
        ,G_Customer_SFDC_NID
        ,G_Customer_SFDC_NID_Link
        ,s_2_Customer_Number
        ,s_2_Customer_Name
        ,s_2_Customer_Address
        ,s_2_Customer_City
        ,s_2_Customer_Country
        ,s_2_Customer_Phone
        ,s_2_Customer_State_Prov
        ,s_2_Customer_Zip_Code
        ,s_2_Customer_Health_Status
        ,s_2_Customer_SFDC_NID
        ,s_2_Customer_SFDC_NID_Link
        ,s_2_Customer_XYZ_NID
        ,s_2_Customer_XYZ_NID_Link
        ,s_2_Customer_Sales_Owner
        ,s_2_Customer_CSM
        ,s_2_Customer_CSM_Manager
        ,s_2_Customer_Sales_Manager
        ,s_2_customer_sales_team
        ,s_2_Customer_PSM
        ,s_2_Customer_PSM_Manager
        ,sbc_number
        ,sbc_status
        ,subscriptiontype
        ,sbc_start_date
        ,sbc_end_date
        ,sbc_termination_date
        ,sbc_SFDC_NID
        ,sbc_SFDC_NID_Link
        ,istestaccount
        ,child_sub_name
        ,parent_sub_name
        ,requiredbyid
        ,Parent_PRODUCTID
        ,parent_productname
        ,Initial_recurrinng_term
        ,Recurrinng_reolover_term
        ,renewal_date
        ,rate_set_uom
        ,Unit_of_Measure
        ,Contract_Number
        ,Contract_SFDC_NID
        ,Contract_SFDC_NID_Link
        ,Contract_Start_Date
        ,Contract_End_Date
    FROM (
        SELECT DISTINCT cust.Id AS Customer_Id
            ,sub.rtpname AS Release_type
            ,org.Name AS Customer_Name
            ,prod.Name AS XYZ_Product_Name
            ,prod.SalesforceId AS XYZ_Product_Salesforce_Number
            ,prod.Code AS XYZ_Product_Code
            ,prod.Type AS XYZ_Product_Type
            ,pb.Name AS Brand_Family
            ,cntr.CURRENCYISOCODE AS currency_code
            ,nvl((
                    SELECT *
                    FROM (
                        SELECT to_char(cliterm.Quantity)
                        FROM XYZ_ContractLineItemTerm cliterm
                        WHERE cliterm.ContractLineItem_id = cli.Id
                            AND (
                                cliterm.EndDate IS NULL
                                OR cliterm.EndDate > add_months(current_date, - 3)
                                )
                            AND cliterm.PriceRuleItem_id IS NULL
                        ORDER BY cli.id DESC
                        )
                    WHERE rownum = 1
                    ), cli.Quantity) AS Qty_Purchased
            ,nvl((
                    SELECT *
                    FROM (
                        SELECT cliterm.UsedQuantity
                        FROM XYZ_ContractLineItemTerm cliterm
                        WHERE cliterm.ContractLineItem_id = cli.Id
                            AND (
                                cliterm.EndDate IS NULL
                                OR cliterm.EndDate > add_months(current_date, - 3)
                                )
                            AND cliterm.PriceRuleItem_id IS NULL
                        ORDER BY cli.id DESC
                        )
                    WHERE rownum = 1
                    ), cli.UsedQuantity) AS qty_u2dt
            ,nvl((
                    SELECT *
                    FROM (
                        SELECT cliterm.StartDate
                        FROM XYZ_ContractLineItemTerm cliterm
                        WHERE cliterm.ContractLineItem_id = cli.Id
                            AND (
                                cliterm.EndDate IS NULL
                                OR cliterm.EndDate > add_months(current_date, - 3)
                                )
                            AND cliterm.PriceRuleItem_id IS NULL
                        ORDER BY cli.id DESC
                        )
                    WHERE rownum = 1
                    ), cli.StartDate) AS sbc_Term_Start_Date
            ,nvl((
                    SELECT *
                    FROM (
                        SELECT cliterm.EndDate
                        FROM XYZ_ContractLineItemTerm cliterm
                        WHERE cliterm.ContractLineItem_id = cli.Id
                            AND (
                                cliterm.EndDate IS NULL
                                OR cliterm.EndDate > add_months(current_date, - 3)
                                )
                            AND cliterm.PriceRuleItem_id IS NULL
                        ORDER BY id DESC
                        )
                    WHERE rownum = 1
                    ), cli.EndDate) AS sbc_Term_End_Date
            ,nvl(to_char(cli.EndDate), (
                    CASE 
                        WHEN (
                                cli.StartDate IS NOT NULL
                                AND con.InitialTerm > 0
                                )
                            THEN 'Auto Renewal'
                        ELSE ''
                        END
                    )) AS Contr_End_Date
            ,cust.SalesforceAccountNumber AS Salesforce_Account_Number
            ,cust.SalesforceId AS Salesforce_csa_Id
            ,'s12345' || con.SalesforceId || '/view' AS Salesforce_Contact
            ,prod_fam.product_family_code AS product_family_code
            ,prd.Product_Family__c AS Product_Family_Description
            ,prd.Brand_Code__c AS Product_Brand_Code
            ,prd.Product_Brand__c AS Product_Brand_Description
            ,prd.Category_Code__c AS Product_Category_Code
            ,prd.Product_Category__c AS Product_Category_Description
            ,prd.name AS Product_Name
            ,prd.productcode AS Product_Code
            ,prd.PRODUCT_TYPE__C AS product_type
            ,dasruler.id AS s_2_CUSTOMER_OWNER_NID
            ,rupa.global_ultimate_d_u_n_s_number AS G_Customer_Number
            ,rupa.name AS G_Customer_Name
            ,rupa.billingstreet AS G_Customer_Address
            ,rupa.billingcity AS G_Customer_City
            ,rupa.billingcountry AS G_Customer_Country
            ,rupa.phone AS G_Customer_Phone
            ,rupa.billingstate AS G_Customer_State_Prov
            ,rupa.billingpostalcode AS G_Customer_Zip_Code
            ,rupa.id AS G_Customer_SFDC_NID
            ,'12345'|| rupa.id || '/view' AS G_Customer_SFDC_NID_Link
            ,csa.csa__c AS s_2_Customer_Number
            ,csa.name AS s_2_Customer_Name
            ,csa.account_address__c AS s_2_Customer_Address
            ,csa.account_city__c AS s_2_Customer_City
            ,csa.account_country__c AS s_2_Customer_Country
            ,csa.phone AS s_2_Customer_Phone
            ,csa.account_state_province__c AS s_2_Customer_State_Prov
            ,csa.account_zip_code__c AS s_2_Customer_Zip_Code
            ,csa.id AS s_2_Customer_SFDC_NID
            ,'12345' || csa.id || '/view' AS s_2_Customer_SFDC_NID_Link
            ,csa.client_health_status__c s_2_Customer_Health_Status
            ,cust.id AS s_2_Customer_XYZ_NID
            ,'q12345' || cust.id || '/view' AS s_2_Customer_XYZ_NID_Link
            ,nvl(dasruler.firstname || ' ' || dasruler.lastname, 'UNKNOWN') AS s_2_Customer_Sales_Owner
            ,nvl(csacsm.csm, 'UNKNOWN') AS s_2_Customer_CSM
            ,nvl(csm_mgr.NAME, 'NAVL') AS s_2_Customer_CSM_Manager
            ,nvl(csasalesmanager.firstname || ' ' || csasalesmanager.lastname, 'UNKNOWN') AS s_2_Customer_Sales_Manager
            ,nvl(csasalesmanager.USER_SEGMENT__C, 'UNKNOWN') AS s_2_customer_sales_team
            ,nvl(csapsm.psm, 'NAVL') AS s_2_Customer_PSM
            ,nvl(psm_mgr.name, 'NAVL') AS s_2_Customer_PSM_Manager
            ,sub.name AS sbc_number
            ,sub.STATUS__C AS sbc_status
            ,sub.sbqq__subscriptiontype__c AS subscriptiontype
            ,nvl(sub.sbqq__subscriptionstartdate__c, sub.sbqq__startdate__c) AS sbc_start_date
            ,sub.SBQQ__ENDDATE__C AS sbc_end_date
            ,sub.sbqq__terminateddate__c AS sbc_termination_date
            ,sub.annual_recurring_total__c AS annual_recurring_total__c
            ,sub.one_time_total__c AS one_time_total__c
            ,sub.currencyisocode AS Localcurrency
            ,sub.id AS sbc_SFDC_NID
            ,'z12345' || sub.id || '/view' AS sbc_SFDC_NID_Link
            ,sub.name AS child_sub_name
            ,sub.RECURRING_INITIAL_TERM__C AS Initial_recurrinng_term
            ,sub.RECURRING_ROLLOVER_TERM__C AS Recurrinng_reolover_term
            ,sub.RENEWAL_DATE__C AS renewal_date
            ,pasub.name AS parent_sub_name
            ,sub.sbqq__requiredbyid__c AS requiredbyid
            ,pasub.SBQQ__PRODUCTID__C AS Parent_PRODUCTID
            ,pasub.SBQQ__PRODUCTNAME__C AS Parent_Productname
            ,csa.is_test_account__c AS istestaccount
            ,prd.rate_set_uom__C AS rate_set_uom
            ,PRD.Quantity_unit_of_measure__C AS Unit_of_Measure
            ,cntr.CONTRACTNUMBER AS Contract_Number
            ,cntr.id AS Contract_SFDC_NID
            ,'c123456'|| cntr.id || '/view' AS Contract_SFDC_NID_Link
            ,cntr.startdate AS Contract_Start_Date
            ,cntr.enddate AS Contract_End_Date
            ,cntr.annual_recurring_total__c AS Contract_annual_recurring_amt
            ,cntr.one_time_total__c AS Contract_one_time_total
            ,cntr.initial_term_total__c AS First_year_contract_value
        FROM XYZ_ContractLineItem cli
        INNER JOIN XYZ_Contract con ON cli.Contract_id = con.Id
        INNER JOIN XYZ_Customer cust ON con.Customer_id = cust.Id
        INNER JOIN XYZ_Organization org ON org.Customer_id = cust.Id
        INNER JOIN XYZ_Product prod ON cli.Product_id = prod.Id
        INNER JOIN XYZ_ProductBrand pb ON prod.ProductBrand_id = pb.Id
        LEFT JOIN sfacc csa ON cust.SalesforceAccountNumber = csa.csa__c
        LEFT JOIN sfacc rupa ON csa.parentid = rupa.id
        LEFT JOIN sf_SBQQ__sbc__C sub ON sub.id = cli.salesforceid
        LEFT JOIN SF_SBQQ__sbc__C pasub ON pasub.id = sub.sbqq__requiredbyid__c
        LEFT JOIN contractor cntr ON cntr.contractnumber = con.ContractNumber
        LEFT JOIN sfu dasruler ON csa.ownerid = dasruler.id
        LEFT JOIN sfu dassalesmgr ON dasruler.managerid = dassalesmgr.id
        LEFT JOIN (
            SELECT f.accountid
                ,g.managerid
                ,max(g.NAME) CSM
                ,max(g.id) CSMID
            FROM sfatm f
            JOIN sfu g ON f.userid = g.id
            WHERE f.teammemberrole = 'AGM'
            GROUP BY f.accountid
                ,g.managerid
            ) dasagm ON dasagm.accountid = csa.id
        LEFT JOIN sfu csm_mgr ON dasagm.managerid = csm_mgr.id
        LEFT JOIN (
            SELECT f.accountid
                ,g.managerid
                ,max(g.NAME) PSM
                ,max(g.id) CSMID
            FROM sfatm f
            JOIN sfu g ON f.userid = g.id
            WHERE f.teammemberrole = 'SDM'
            GROUP BY f.accountid
                ,g.managerid
            ) dassdm ON dassdm.accountid = csa.id
        LEFT JOIN sfu psm_mgr ON dassdm.managerid = psm_mgr.id
        LEFT JOIN SFP prd ON prod.Code = prd.productcode
        LEFT JOIN IPFam prod_fam ON prod_fam.product_family_desc = prd.Product_Family__c
        WHERE cli.RateEffectiveStatus = 'A'
            AND cli.STATUS = 'A'
            AND cli.Active = 1
            AND con.STATUS IN ('A')
            AND CUST.STATUS = 'active'
            AND prod.type <> 'KING'
            AND csa.itac = 0
        )
    WHERE Qty_Purchased <> 0
    );

1 个答案:

答案 0 :(得分:1)

Snowflake 没有 Oracle 那样的 ROWNUM 关键字。

如果您想使用该功能,可以使用窗口函数 row_number() 生成等效项。这通常是通过将该窗口函数插入到查询的底层来完成的。