簡體   English   中英

關鍵字“ WHERE”附近的語法不正確已更新

[英]Incorrect syntax near the keyword 'WHERE' updated

該查詢的目的是在某些行中檢查錯誤信息。 信息不正確的行應該顯示為固定的。 但是,當我運行此查詢時,出現以下錯誤:

此報告使用的存儲過程不在您的數據庫中

Run_Report中的錯誤

說明:關鍵字WHERE'附近的語法不正確

SELECT 
grp.customer "Customer", 
grp.customershipto "CST", 
cst.name "Name", 
cst.city "City", 
cst.territory "CST Territory",
grp.spcgroup "SPC Group",
grp.territory "SPC Group Territory",
(Case
WHEN cst.territory = 200 THEN 
      (Case WHEN cst.territory = grp.territory THEN 'Correct'
         ELSE 'Look Into' END)
ELSE
      (Case WHEN substring(grp.territory,2,3) = cst.territory THEN 'Correct' ELSE 'Look Into' END)
END) "Salesman SPC Check",
(Case 
  When Sum(tgrp.spcgrp2) = 28 and cst.customertype = 'IND' THEN 'Correct'
  when Sum(tgrp.spcgrp2) = 25 and cst.customertype = 'ENG' THEN 'Correct'
  when cst.territory = 200 THEN 'Correct'
ELSE 'Look Into'
  END) "Number of SPCs",
(Case 
 WHEN cst.territory = 200 THEN ' '
ELSE 
 (Case WHEN substring(grp.territory,6,1) <> substring(grp.spcgroup,5,1) THEN 'WRONG SPC Group Territory' ELSE 'Correct' END)
END) "SPC Group Territory Check",
  (Case
  WHEN grp.Territory = 'T01001' THEN 'Correct'
  WHEN grp.Territory = 'T01002' THEN 'Correct'
  WHEN grp.Territory = 'T01003' THEN 'Correct'
  WHEN grp.Territory = 'T01004' THEN 'Correct'
  WHEN grp.Territory = 'T01005' THEN 'Correct'
  WHEN grp.Territory = 'T01006' THEN 'Correct'
  WHEN grp.Territory = 'T01007' THEN 'Correct'
  WHEN grp.Territory = 'T02001' THEN 'Correct'
  WHEN grp.Territory = 'T02002' THEN 'Correct'
  WHEN grp.Territory = 'T02003' THEN 'Correct'
  WHEN grp.Territory = 'T02004' THEN 'Correct'
  WHEN grp.Territory = 'T02005' THEN 'Correct'
  WHEN grp.Territory = 'T02006' THEN 'Correct'
  WHEN grp.Territory = 'T02007' THEN 'Correct'
  WHEN grp.Territory = 'T03001' THEN 'Correct'
  WHEN grp.Territory = 'T03002' THEN 'Correct'
  WHEN grp.Territory = 'T03003' THEN 'Correct'
  WHEN grp.Territory = 'T03004' THEN 'Correct'
  WHEN grp.Territory = 'T03005' THEN 'Correct'
  WHEN grp.Territory = 'T03006' THEN 'Correct'
  WHEN grp.Territory = 'T03007' THEN 'Correct'
  WHEN grp.Territory = 'T04001' THEN 'Correct'
  WHEN grp.Territory = 'T04002' THEN 'Correct'
  WHEN grp.Territory = 'T04003' THEN 'Correct'
  WHEN grp.Territory = 'T04004' THEN 'Correct'
  WHEN grp.Territory = 'T04005' THEN 'Correct'
  WHEN grp.Territory = 'T04006' THEN 'Correct'
  WHEN grp.Territory = 'T04007' THEN 'Correct'
  WHEN grp.Territory = 'T05001' THEN 'Correct'
  WHEN grp.Territory = 'T05002' THEN 'Correct'
  WHEN grp.Territory = 'T05003' THEN 'Correct'
  WHEN grp.Territory = 'T05004' THEN 'Correct'
  WHEN grp.Territory = 'T05005' THEN 'Correct'
  WHEN grp.Territory = 'T05006' THEN 'Correct'
  WHEN grp.Territory = 'T05007' THEN 'Correct'
  WHEN grp.Territory = 'T10001' THEN 'Correct'
  WHEN grp.Territory = 'T10002' THEN 'Correct'
  WHEN grp.Territory = 'T10004' THEN 'Correct'
  WHEN grp.Territory = 'T10005' THEN 'Correct'
  WHEN grp.Territory = 'T10006' THEN 'Correct'
  WHEN grp.Territory = 'T10007' THEN 'Correct'
  WHEN grp.Territory = 'T11001' THEN 'Correct'
  WHEN grp.Territory = 'T11002' THEN 'Correct'
  WHEN grp.Territory = 'T11004' THEN 'Correct'
  WHEN grp.Territory = 'T11005' THEN 'Correct'
  WHEN grp.Territory = 'T11006' THEN 'Correct'
  WHEN grp.Territory = 'T11007' THEN 'Correct'
  WHEN grp.Territory = 'T12001' THEN 'Correct'
  WHEN grp.Territory = 'T12002' THEN 'Correct'
  WHEN grp.Territory = 'T12004' THEN 'Correct'
  WHEN grp.Territory = 'T12005' THEN 'Correct'
  WHEN grp.Territory = 'T12006' THEN 'Correct'
  WHEN grp.Territory = 'T12007' THEN 'Correct'
  WHEN grp.Territory = 'T13001' THEN 'Correct'
  WHEN grp.Territory = 'T13002' THEN 'Correct'
  WHEN grp.Territory = 'T13004' THEN 'Correct'
  WHEN grp.Territory = 'T13005' THEN 'Correct'
  WHEN grp.Territory = 'T13006' THEN 'Correct'
  WHEN grp.Territory = 'T13007' THEN 'Correct'
  WHEN cst.Territory = 200 THEN 'Correct'
 ELSE 'Invalid'
 END) "6 Digit SPC Group Territory", 
 grp.dateadded "Date SPC Group Added", 
 grp.useridadded "User Added", 
 grp.datemod "Date SPC Group Mod.", 
 grp.useridmod "User Mod"

From ARCustomerSHIPTOSPCGroup Grp
 Left outer Join Arcustomershipto cst on Grp.customershipto = cst.customershipto
 Left outer Join
(Select grp2.customershipto,
  Sum(Case
       When grp2.spcgroup = 'SPC01' THEN 1
       when grp2.spcgroup = 'SPC02' THEN 2
       when grp2.spcgroup = 'SPC03' THEN 3
       when grp2.spcgroup = 'SPC04' THEN 4
       when grp2.spcgroup = 'SPC05' THEN 5
       when grp2.spcgroup = 'SPC06' THEN 6
       when grp2.spcgroup = 'SPC07' THEN 7
      END) spcgrp2_sum
 From ARCustomerSHIPTOSPCGroup grp2
 Group By grp2.customershipto
) tgrp                                                                                                                                                                                        

WHERE  cst.status = 'Active'

Group by
  grp.customer, grp.customershipto, cst.name, cst.city, cst.territory,    cst.customertype, grp.spcgroup, grp.territory, grp.dateadded, grp.dateadded, grp.useridadded, grp.datemod, grp.useridmod

HAVING    NOT (   (cst.territory = 200 AND cst.territory = grp.territory)
           OR (substring (grp.territory, 2, 3) = cst.territory))
   OR NOT (   (SUM (tgrp.spcgrp2) = 28 AND cst.customertype = 'IND')
           OR (SUM (tgrp.spcgrp2) = 25 AND cst.customertype = 'ENG')
           OR (cst.territory = 200))

聚合是根據GROUP BY語句計算的,它們告訴數據庫要聚合哪些行。 在大方案中,這是在執行WHERE子句之后發生的。 您必須先過濾可用的行, 然后才能對它們進行分組。

您沒有為我提供足夠的代碼來提供具體的解決方案。 但是,有兩種方法可以避免此問題。 使用HAVING子句,或在where子句中使用子查詢。

HAVING子句的使用方式與WHERE但是它按照處理順序在GROUP BY之后。 它可以執行以下操作:獲取25歲以上的擁有十個以上用戶的所有用戶類型:

SELECT users.type
FROM users
WHERE users.age > 25
GROUP BY users.type
HAVING count(users.id) > 10

不幸的是,SQL的設計方式使子句在書面查詢中出現的順序與它們執行的順序不太吻合。 這是造成混亂的常見原因,尤其是在別名方面。 您可以在這里閱讀有關處理邏輯順序的更多信息: http : //www.jooq.org/doc/3.0/manual/sql-building/sql-statements/select-statement/select-lexical-vs-logical-order/

編輯:

我認為解決方案實際上要簡單得多。 您的第二個外部聯接是您提出spcgrp2字段的地方。 在其余查詢中,您僅使用scpgrp2字段的總和。 因此,只需在子查詢中對其求和即可。

您的第二個左外部連接變為

Left outer Join
    (Select grp2.customershipto,
      Sum(Case
           When grp2.spcgroup = 'SPC01' THEN 1
           when grp2.spcgroup = 'SPC02' THEN 2
           when grp2.spcgroup = 'SPC03' THEN 3
           when grp2.spcgroup = 'SPC04' THEN 4
           when grp2.spcgroup = 'SPC05' THEN 5
           when grp2.spcgroup = 'SPC06' THEN 6
           when grp2.spcgroup = 'SPC07' THEN 7
          END) spcgrp2_sum
     From ARCustomerSHIPTOSPCGroup grp2
     Group By grp2.customershipto
    ) tgrp

然后用Sum(tgrp.spcgrp2)將兩行更改為

  When tgrp.spcgrp2_sum = 28 and cst.customertype = 'IND' THEN 'Correct'
  when tgrp.spcgrp2_sum = 25 and cst.customertype = 'ENG' THEN 'Correct'

只是讓您以Tab Alleman提到的方式開始:

(Case WHEN (select Sum(tgrp.spcgrp2) from tgrp) = 28 and cst.customertype = 'IND' THEN 'Correct' ELSE 'Look Into' END) = 'Look Into'

正如其他人所指出的那樣,您不能在WHERE子句中引用聚合函數。 這就是HAVING目的。

另外,很少有充分的理由在WHERE子句中使用CASE 您應該考慮將其轉換為布爾邏輯。 我相信以下將完成您正在嘗試的事情:

WHERE  cst.status = 'Active'
--Your GROUP BY clause goes here
HAVING    NOT (   (cst.territory = 200 AND cst.territory = grp.territory)
               OR (substring (grp.territory, 2, 3) = cst.territory))
       OR NOT (   (SUM (tgrp.spcgrp2) = 28 AND cst.customertype = 'IND')
               OR (SUM (tgrp.spcgrp2) = 25 AND cst.customertype = 'ENG')
               OR (cst.territory = 200))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM