我正在遇到符号的问题。
说明:每个Orderno至少有一个rxnum与之绑定。但是每个rxnum都可以具有多个脚本(Scriptitemcnt(。我的问题是,我试图使用一个符号对仅使用拉订单,该项目的总和小于或等于8。查询将执行,但仍在拉订单总和大于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
我看到了两个可能的问题。首先,您将计数与字符串'8'
而不是数字8
进行比较。取决于SQL Server的解释方式,这可能导致诸如10
之类的数字小于8
。
现在这是一个简单的问题。从您的描述中,听起来您想要 orders ,总数不大于8。
当您使用GROUP BY
时,组中的聚合(例如sum()
(计数。因为您正在显示(即 SELECT
ing( - 因此通过-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