我遇到了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
答案 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