Excel:关键字'SELECT'附近的语法不正确

情景:我正在Excel中创build一个报告来计算佣金。 这是基于上个月的发票。 我创build了下面的tsql查询并使用MSQuery创build了一个连接。 我testing了查询,它工作完美,直到我改变我的Where语句使用参数"?" 所以我可以,那么我得到以下错误:

 Incorrect Syntax near the keyword `'SELECT'` 

这是查询:

 SELECT v_rpt_Invoices.Invoice_Number, v_rpt_Invoices.Territory, v_rpt_Company.Account_Nbr, v_rpt_Invoices.Company_Name, v_rpt_Invoices.Date_Invoice, v_rpt_Invoices.Location, v_rpt_Invoices.TicketNbr, v_rpt_Invoices.Project_ID, v_rpt_Invoices.Invoice_Type, v_rpt_Invoices.Status_Description, CASE WHEN TicketNbr <> 0 THEN 'Service Ticket' WHEN Project_ID IS NOT NULL THEN 'Project' ELSE 'Other' END AS Invoice_For, CASE WHEN ticketNbr <> 0 THEN (SELECT v_rpt_Service.Board_Name FROM v_rpt_Service WHERE v_rpt_Invoices.TicketNbr = v_rpt_Service.TicketNbr) WHEN Project_ID IS NOT NULL THEN Project_ID ELSE 'Other' END AS Service_Board_Project, CASE WHEN TicketNbr <> 0 THEN (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) WHEN project_id IS NOT NULL THEN (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) ELSE 'NONE' END AS BillingMethod, v_rpt_Invoices.Invoice_Amount, CASE WHEN (TicketNbr <> 0 AND (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) = 'A') THEN Invoice_Amount * 0.7 WHEN (TicketNbr <> 0 AND (SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID) = 'F') THEN 0.01 WHEN (project_id IS NOT NULL AND (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) = 'A') THEN Invoice_Amount * 0.7 WHEN (project_id IS NOT NULL AND (SELECT PM_Billing_Method_ID FROM PM_Project WHERE v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID) = 'F') THEN 0.01 ELSE 0.00 END AS Cost FROM v_rpt_Invoices INNER JOIN v_rpt_Company ON v_rpt_Invoices.Company_RecID = v_rpt_Company.Company_RecID **WHERE (v_rpt_Invoices.Date_Invoice >= ?)** order by Territory, Invoice_For 

删除这一行

  **WHERE (v_rpt_Invoices.Date_Invoice >= ?)** 

这是无效的SQL – 看起来像你想评论使用双破折号。

除非你只是把**显示你改变了什么。 在这种情况下,你需要有一个价值在哪里? 是SQL将无法正常工作。


作为一个帮助,这个查询可以做得更清晰,更快。 考虑将子查询合并到一个连接中。 例如,下面的子查询

 SELECT Bill_Method FROM SR_Service WHERE v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID 

必须被调用每一行 – 如果你把这个连接从O(nm)转到O(n + m),其中n是v_rpt_Invoices的大小,m是SR_Service的大小。

这只是您可以优化的潜在子查询之一。

这里是一个滚动的例子子查询(我不能testing,所以它可能有错误/错别字)

 SELECT v_rpt_Invoices.Invoice_Number, v_rpt_Invoices.Territory, v_rpt_Company.Account_Nbr, v_rpt_Invoices.Company_Name, v_rpt_Invoices.Date_Invoice, v_rpt_Invoices.Location, v_rpt_Invoices.TicketNbr, v_rpt_Invoices.Project_ID, v_rpt_Invoices.Invoice_Type, v_rpt_Invoices.Status_Description, CASE WHEN TicketNbr <> 0 THEN 'Service Ticket' WHEN Project_ID IS NOT NULL THEN 'Project' ELSE 'Other' END AS Invoice_For, CASE WHEN ticketNbr <> 0 THEN v_rpt_Service.Board_Name WHEN Project_ID IS NOT NULL THEN Project_ID ELSE 'Other' END AS Service_Board_Project, CASE WHEN TicketNbr <> 0 THEN SR_Service.Bill_Method WHEN project_id IS NOT NULL THEN PM_Project.PM_Billing_Method_ID ELSE 'NONE' END AS BillingMethod, v_rpt_Invoices.Invoice_Amount, CASE WHEN (TicketNbr <> 0 AND SR_Service.Bill_Method ='A') THEN Invoice_Amount * 0.7 WHEN (TicketNbr <> 0 AND SR_Service.Bill_Method ='F') THEN 0.01 WHEN (project_id IS NOT NULL AND PM_Project.PM_Billing_Method_ID = 'A') THEN Invoice_Amount * 0.7 WHEN (project_id IS NOT NULL AND PM_Project.PM_Billing_Method_ID = 'F') THEN 0.01 ELSE 0.00 END AS Cost FROM v_rpt_Invoices INNER JOIN v_rpt_Company ON v_rpt_Invoices.Company_RecID = v_rpt_Company.Company_RecID LEFT JOIN SR_Service ON v_rpt_Invoices.TicketNbr = SR_Service.SR_Service_RecID LEFT JOIN PM_Project ON v_rpt_Invoices.PM_Project_RecID = PM_Project.PM_Project_RecID LEFT JOIN v_rpt_Service ON v_rpt_Invoices.TicketNbr = v_rpt_Service.TicketNbr WHERE (v_rpt_Invoices.Date_Invoice >= '1/1/2013') order by Territory, Invoice_For