[英]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.