【问题标题】:Msg 156, Level 15, State 1, Line 22 Incorrect syntax near the keyword 'having'消息 156,级别 15,状态 1,第 22 行关键字“有”附近的语法不正确
【发布时间】:2016-03-08 21:21:18
【问题描述】:
SELECT 
    CCDMS_Company.CompanyID, CCDMS_Company.CompanyName,
    CCDMS_Container.ContainerID, CCDMS_Container.Price, 
    SUM(CASE WHEN CCDMS_Container.ContainerSize = 1
             THEN 1 ELSE 0 END) AS size1,
    SUM(CASE WHEN CCDMS_Container.ContainerSize = 2
             THEN 1 ELSE 0 END) AS size2,
    SUM(CASE WHEN CCDMS_Container.ContainerSize = 3
             THEN 1 ELSE 0 END) AS size3,
    SUM(CASE WHEN CCDMS_Container.ContainerSize = 4
             THEN 1 ELSE 0 END) AS size4,
    SUM(CASE WHEN CCDMS_Container.ContainerSize = 5
             THEN 1 ELSE 0 END) AS size5
FROM 
    CCDMS_Company
INNER JOIN 
    CCDMS_Container ON CCDMS_Container.Co_ID = CCDMS_Company.CompanyID
                    AND CCDMS_Company.CityID = 1
GROUP BY 
    CCDMS_Company.CompanyID, CCDMS_Company.CompanyName,
    CCDMS_Container.ContainerID, CCDMS_Container.Price
HAVING
    size1 >=2
    AND size2 >= 1
    AND size3 >= 1
    AND size4 >= 0
    AND size5 >= 1 ;

这是我的查询,即使我使用 where ,我也会不断收到此错误。

我不知道该怎么办。

消息 156,第 15 级,状态 1,第 22 行
关键字“have”附近的语法不正确。

【问题讨论】:

  • 将计算放入 CTE / 子查询中,然后使用 where 过滤引用别名 size*
  • 我可以理解 having 子句在语法上是不正确的,因为它不理解列别名。但是,这应该会生成“无效的列名”错误,而不是“不正确的语法”错误。我怀疑您在 having 关键字周围的某处有一个无效字符。
  • 我正在尝试做类似于 stackoverflow.com/questions/17194145/… 的事情,但之后我想做的是只返回具有相同或更多指定数字的公司我也看到了这个问题stackoverflow.com/questions/15618812/… 所以我把它们结合起来,希望它能和我一起工作。
  • 我怎么能用我试过的子查询但结果不正确。

标签: sql sql-server


【解决方案1】:

你不能使用别名。改为使用下面,或为简单起见使用 CTE

select CCDMS_Company.CompanyID , CCDMS_Company.CompanyName ,
CCDMS_Container.ContainerID ,CCDMS_Container.Price , 
sum(case when CCDMS_Container.ContainerSize=1
 then 1 else 0 end)as size1,
sum(case when CCDMS_Container.ContainerSize=2
 then 1 else 0 end)as size2,
sum(case when CCDMS_Container.ContainerSize=3
 then 1 else 0 end)as size3,
sum(case when CCDMS_Container.ContainerSize=4
 then 1 else 0 end)as size4,
sum(case when CCDMS_Container.ContainerSize=5
 then 1 else 0 end)as size5
   from 
CCDMS_Company
 inner join
CCDMS_Container
on CCDMS_Container.Co_ID = CCDMS_Company.CompanyID
and 
CCDMS_Company.CityID = 1
group by 
CCDMS_Company.CompanyID,CCDMS_Company.CompanyName,CCDMS_Container.ContainerID,CCDMS_Container.Price

having
    sum(case when CCDMS_Container.ContainerSize=1 then 1 else 0 end) >=2
and sum(case when CCDMS_Container.ContainerSize=2 then 1 else 0 end) >= 1
and sum(case when CCDMS_Container.ContainerSize=3 then 1 else 0 end) >= 1
and sum(case when CCDMS_Container.ContainerSize=4 then 1 else 0 end) >= 0
and sum(case when CCDMS_Container.ContainerSize=5 then 1 else 0 end) >= 1

【讨论】:

  • 它正在工作,但不幸的是它没有返回正确的结果。
  • @Nysa,你得到了什么和预期什么?
  • 我有 3 家公司 1001,1002 ,1003 和 11 个不同尺寸的容器 1,2,3,4,5 我只想退回公司中数量相同或更多的容器的指定数字。例如,如果我想要 2 个尺寸 1 的容器和 3 个尺寸 2 的容器,那么只有公司中具有 2 个或更多尺寸 1 和 3 个或更多尺寸 2 的容器应该出现让我们说只有公司 1001 有它们然后它应该单独出现。但知道它会返回所有这些。
  • @Nysa,请提出一个新问题。
【解决方案2】:

您不能在 having 语句中从您的 select 语句中引用别名。尝试使用子查询重新构建查询以对其进行过滤。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多