在SQL Server 2008中有子句问题



我正在遇到符号的问题。
说明:每个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

相关内容

  • 没有找到相关文章

最新更新