在SQL Server 2008中遇到子句问题

时间:2017-05-04 14:19:30

标签: sql sql-server sql-server-2008

我遇到了HAVING条款的问题 说明:每个orderno至少有一个rxnum绑定它。但是每个rxnum都可以有多个脚本(scriptitemcnt)。我的问题是我正在尝试使用HAVING子句来 ONLY 拉出具有小于或等于8的项的SUM的orderno。查询将执行,但它仍在拉动项目总和大于8的订单。这是我的代码:

SELECT
oh.orderno,
od.rxnum,
SUM(od.scriptitemcnt) as scriptitemcnt,
od.ndctopick,
od.drugdesc,
od.unitno,
od.status,
od.datetimefilled,
od.packingunit,
od.datetimepacked,
oh.totesideinorder

FROM
mck_hvs.oldorderdetails od with( nolock ),
mck_hvs.oldorderheader oh with( nolock )

WHERE
oh.orderno = od.orderno
and od.status != 5
and ( @dateFrom is NULL or od.datetimepacked >= cast( @dateFrom as datetime ) )
and ( @dateTo   is NULL or od.datetimepacked  <  cast( @dateTo as datetime ) + 1 )
and oh.totesideinorder = 'N'
and od.packingunit NOT IN (695, 696, 697, 698)

GROUP BY
oh.orderno,
od.rxnum,
od.scriptitemcnt,
od.ndctopick,
od.drugdesc,
od.rxnum,
od.unitno,
od.status,
od.datetimefilled,
od.packingunit,
od.datetimepacked,
oh.totesideinorder

HAVING 
SUM(od.scriptitemcnt) <= '8'

ORDER BY
oh.orderno asc,
od.rxnum asc

1 个答案:

答案 0 :(得分:0)

我看到两个可能的问题。首先,您要将计数与字符串'8'进行比较,而不是将数字8进行比较。根据SQL Server解释事物的方式,可能会导致10之类的数字被视为小于8

现在这是一个简单的问题。根据您的描述,您可能希望订单总计数不超过8.如果这是正确的,那么更大的问题是......

使用GROUP BY时,聚合(例如sum())会计入组内。因为您正在展示(即SELECT) - 因此按RXNUM进行分组,所以总和是RXNUM,而不是每个订单。如果你想为每个RXNUM提取一条记录,但根据整个ORDERNO的汇总进行过滤,那么它比你在这里做的要复杂一些。

您可以使用SUM() OVER()代替SUM()作为起点。但是IIRC不能直接用于sql-server中的过滤,所以你最终需要一个子查询。像

这样的东西
select *
  from (select oh.orderno, od.rxnum
             , sum(od.scriptitemcnt) over(partition by orderno) as order_scriptitemcnt
               -- other data
          from -- ...
       )
 where order_scriptitemcnt <= 8