繁体   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