2017-05-04 87 views
0

我遇到了我的HAVING子句問題。
說明:每個orderno至少有一個rxnum綁定到它。但是每個rxnum都可以有多個腳本(scriptitemcnt)。我的問題是我試圖使用HAVING子句來只有 pull orderno的項目總和小於或等於8.查詢將執行,但它仍然拉取項目總和大於8的訂單。這裏是我的代碼:HAVING SQL Server 2008中的子句問題

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 
+2

我們沒有您的表格和數據。嘗試簡化爲更小(更少列)的表格和一些示例數據,這些數據仍然表明問題,然後將其添加(和簡化查詢)到您的問題中。 –

+0

我沒有看到你發佈的查詢有什麼明顯的錯誤。您需要添加一個重現問題的腳本,否則我們將無法爲您提供幫助。 –

+1

SUM(od.scriptitemcnt)<='8'爲什麼'8'是字符串?它應該是INTEGER禮儀? –

回答

0

我看到兩個可能的問題。首先,您將數字與字符串'8'進行比較,而不是數字8。根據SQL服務器如何解釋事物,可能會導致10等數字小於8

現在這是一個簡單的問題。從你的描述,它聽起來就像你想訂單有一個總數不大於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 
+0

「取決於SQL服務器如何解釋事物」 - 這不是一個深奧的謎團。有數據類型優先規則。並且所有的數字類型都高於字符串類型。通過甚至提出這種可能性,你正在做一個理解的解脫。 –

+0

@Damien_The_Unbeliever - 這是一個很好的意見。下面是另一個更具有實用意義的方法:通過建議人們編寫依賴於DBMS特定優先級規則的代碼,*您正在爲編程提供解除服務。 –

+0

寫好*,純便攜式ANSI SQL代碼實際上是不可能的。事實是,只要你是例如使用日期/時間數據,您將使用特定的方言。一旦你用特定的方言工作,是的,我建議你應該熟悉那種方言,就像用一種全新的語言一樣。學習任何編程語言的一部分至少應該是試圖熟悉該語言的規則。 –