如何将此 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)
上面的代码中可能不需要与原来的一些间距。
我正在尝试将此 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)
上面的代码中可能不需要与原来的一些间距。