2013-01-31 2 views
1

시나리오 : 커미션을 계산하기 위해 Excel에서 보고서를 작성합니다. 이는 지난 달의 인보이스를 기반으로합니다. 다음 tsql 쿼리를 생성하고 MSQuery을 사용하여 연결을 만들었습니다.Excel : 키워드 '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 

답변

0
: 나는 쿼리를 테스트하고 나는 "?" 그래서 난, 나는 다음과 같은 오류 얻을 수있는 매개 변수를 사용하여 내 경우 문 변경할 때까지 완벽 작동 : 쿼리 여기

Incorrect Syntax near the keyword `'SELECT'` 

입니다

이 줄 유효한 SQL하지

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

을 제거하는 - 당신이 사용을 두 번 대시를 언급 할 것 같습니다.

변경 한 내용을 표시하기 위해 **을 붙이지 않는다면 예외입니다. 이 경우 ? 값이 있어야 SQL이 작동하지 않습니다.


이 쿼리는 훨씬 더 명확하고 빨라질 수 있습니다. 하위 쿼리를 조인으로 통합하는 것을 고려하십시오. 예를 들어, 다음과 같은 하위 쿼리의

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

모든 행에 대해 호출해야합니다 - 당신이 이것을 할 경우 n은 v_rpt_Invoices의 크기 인 경우 (N + m) O에 O (㎚)에서 이동 조인 m은 SR_Service의 크기입니다.

이것은 잠재적 인 하위 쿼리 중 하나 일뿐입니다. 여기

(나는 그것이 버그/오타가있을 수 있으므로 테스트 할 수 없습니다) 귀하의 예제 에 하위 쿼리에서

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 
+0

감사 롤링의 예입니다. 나는 "?" 전에. 일반적으로 SQL에서 쿼리를 작성한 후 Excel에서 사용할 준비가되었을 때 "?" 매개 변수를 정의합니다. 그러면 Excel에서 쿼리에 전달할 정보가있는 셀을 선택할 수 있습니다. – MTRXITGuy

+0

@ user2023062 - 귀하의 문제가 정확히 무엇인지 확신 할 수 없습니다. 오류가 발생하는 정확한 쿼리는 무엇이며 날짜가 변환되고 있는지 확실합니까? 어쨌든 위의 쿼리를 다시 작성하십시오.이 버전은 더 나은 구문 분석을 할 수 있으며 확실히 더 빠를 것입니다. – Hogan

+0

빙고! 쿼리를 최적화 해 주신 Hogan에게 감사드립니다. 그것은 완벽하게 작동합니다. 나는 아마도 내 모든 선택 진술로 무언가를 잃어 버렸을 것이다. Excel에 붙여 넣을 수 있었고 날짜를? 이제 셀에 날짜를 입력하면 데이터가 새로 고침됩니다. – MTRXITGuy