如何将此 SQL 输入到 Excel VBA 脚本中?

How to enter this SQL into Excel VBA script?

我正在尝试将此 SQL 语句转换为 excel 中的 VBA,但我似乎无法获得正确的语法。

这是查询:

    with cte as ( 
    select
        [Job #]
        ,[Date]
        ,[Variance Amt]
        ,[Job QTY] 
        ,[OpenQty] 
        ,[Part #] 
        ,[Material] 
        ,[PCS #] 
        ,[Matrl$$] 
        ,[Date Last Issue] 
        ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders] 
        ,[PO$$] 
        ,[Date Last Rcvd] 
        ,[Wip Total] 
        ,[per pc] 
        ,[Standard Cost] 
        ,[DIFF] 
        ,[% of Profit] 
        ,ROW_NUMBER() OVER(PARTITION BY [Job #] ORDER BY [Job #]) AS rn
        ,count(*) over(partition by [Job #]) as maxrn
        ,sum([Matrl$$]) over(partition by [Job #]) as [Job Matrl$$]
        ,sum([PO$$]) over(partition by [Job #]) as [Job PO$$]
        FROM [CompanyR].[dbo].[WIPVarianceRptView]
)

SELECT  [Job #]
        ,[Date]
        ,[Variance Amt]
        ,[Job QTY] 
        ,[OpenQty] 
        ,[Part #] 
        ,[Material] 
        ,[PCS #] 
        ,[Matrl$$]
        ,[Date Last Issue] 
        ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders] 
        ,case when rn <> maxrn then 0 else [PO$$]           end as [PO$$]
        ,[Date Last Rcvd] 
        ,case when rn <> maxrn then 0 when rn = maxrn then ([Job PO$$] + [Job Matrl$$]) else 0      end as [Wip Total]
        ,case when rn <> maxrn then 0 else [per pc]         end as [per pc] 
        ,case when rn <> maxrn then 0 else [Standard Cost]  end as [Standard Cost]
        ,case when rn <> maxrn then 0 else [DIFF]           end as [DIFF] 
        ,case when rn <> maxrn then 0 else [% of Profit]    end as [% of Profit] 
        ,maxrn as [MAX of ROW NO by JOB]
        FROM cte
        Order By [Job #]

这就是我要放入 Excel VBA

中的内容
    sSQL = "with cte as" & _
"(" & _
"       SELECT [Job #]" & _
"       [Date], [Variance Amt], [Job QTY], [OpenQty], [Part #], [Material], [PCS #], [Mtrl$$], [Date Last Issue]" & _
"       ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders]" & _
"       ,[PO$$], [Date Last Rcvd], [Wip Total], [per pc], [Standard Cost], [DIFF], [% of Profit]" & _
"       ,ROW_NUMBER() OVER(PARTITION BY [Job #] ORDER BY [Job #]) AS rn" & _
"       ,count(*) over(partition by [Job #]) as maxrn" & _
"       ,sum([Matrl$$]) over(partition by [Job #]) as [Job Matrl$$]" & _
"       ,sum([PO$$]) over(partition by [Job #]) as [Job PO$$]" & _
"  FROM [CompanyR].[dbo].[WIPVarianceRptView]" & _
")" & _
"       SELECT  [Job #]" & _
"       ,[Date], [Variance Amt], [Job QTY], [OpenQty], [Part #], [Material], [PCS #], [Mtrl$$], [Date Last Issue]" & _
"       ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders]" & _
"       ,case when rn <> maxrn then 0 else [PO$$]           end as [PO$$]" & _
"       ,[Date Last Rcvd]" & _
"       ,case when rn <> maxrn then 0 when rn = maxrn then ([Job PO$$] + [Job Matrl$$]) else 0      end as [Wip Total]" & _
"       ,case when rn <> maxrn then 0 else [per pc]         end as [per pc]" & _
"       ,case when rn <> maxrn then 0 else [Standard Cost]  end as [Standard Cost]" & _
"       ,case when rn <> maxrn then 0 else [DIFF]           end as [DIFF]" & _
"       ,case when rn <> maxrn then 0 else [% of Profit]    end as [% of Profit]" & _
"   FROM cte" & _
"   Order By [Job #]"

您会注意到我还压缩了一些行,因为我收到了关于太多行继续的警告。我在这个转换中哪里出错了?

您的 SQL 没问题 - VBA 编辑器根本不允许超过 25 行继续。简单的解决方法:将作业分成几部分。

sSQL = "with cte as" & _
   "(" & _
   "   SELECT [Job #]" & _
       (...)
   "  FROM [CompanyR].[dbo].[WIPVarianceRptView]" & _
   ")"
 sSQL = sSQL & _
    "SELECT  [Job #]" & _
    "       ,[Date], [Variance Amt], [Job QTY], [OpenQty], [Part #], [Material], [PCS #], [Mtrl$$], [Date Last Issue]" & _
           (...)
    "   FROM cte" & _
    "   Order By [Job #]"

不是对 OP 问题的直接回答,而是一种简化查询创建的方法。诀窍是使用 ArrayList 或 Scripting.Dictionary 到 assemble 语句,然后使用 vbNullstring VBA.Join 成员数组。

ArrayList 版本如下。如果使用 Scripting.Dictionary 那么您需要为每个添加提供一个密钥。最简单的方法是使用 .count

.Add .count,"with cte as"

    ' Requires a reference to mscorlib
    Dim myQuery As ArrayList
    Set myQuery = New ArrayList

    ' or use late bound object
    Dim myQuery As Object
    Set myQuery = CreateObject("ArrayList")
    
    With myQuery
        .Add "with cte as"
        .Add "("
        .Add "       SELECT [Job #]"
        .Add "       [Date], [Variance Amt], [Job QTY], [OpenQty], [Part #], [Material], [PCS #], [Mtrl$$], [Date Last Issue]"
        .Add "       ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders]"
        .Add "       ,[PO$$], [Date Last Rcvd], [Wip Total], [per pc], [Standard Cost], [DIFF], [% of Profit]"
        .Add "       ,ROW_NUMBER() OVER(PARTITION BY [Job #] ORDER BY [Job #]) AS rn"
        .Add "       ,count(*) over(partition by [Job #]) as maxrn"
        .Add "       ,sum([Matrl$$]) over(partition by [Job #]) as [Job Matrl$$]"
        .Add "       ,sum([PO$$]) over(partition by [Job #]) as [Job PO$$]"
        .Add "  FROM [CompanyR].[dbo].[WIPVarianceRptView]"
        .Add ")"
        .Add "       SELECT  [Job #]"
        .Add "       ,[Date], [Variance Amt], [Job QTY], [OpenQty], [Part #], [Material], [PCS #], [Mtrl$$], [Date Last Issue]"
        .Add "       ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders]"
        .Add "       ,case when rn <> maxrn then 0 else [PO$$]           end as [PO$$]"
        .Add "       ,[Date Last Rcvd]"
        .Add "       ,case when rn <> maxrn then 0 when rn = maxrn then ([Job PO$$] + [Job Matrl$$]) else 0      end as [Wip Total]"
        .Add "       ,case when rn <> maxrn then 0 else [per pc]         end as [per pc]"
        .Add "       ,case when rn <> maxrn then 0 else [Standard Cost]  end as [Standard Cost]"
        .Add "       ,case when rn <> maxrn then 0 else [DIFF]           end as [DIFF]"
        .Add "       ,case when rn <> maxrn then 0 else [% of Profit]    end as [% of Profit]"
        .Add "   FROM cte"
        .Add "   Order By [Job #]"

    sSQL = vba.Join(myQuery.Toarray, vbNullString)

上面的代码中可能不需要与原来的一些间距。