2017-05-04 12 views
0

HAVING句に問題があります。
説明:各ordernoには少なくとも1つのrxnumが関連付けられています。しかし、各rxnumは複数のスクリプト(scriptitemcnt)を持つことができます。私の問題は、HAVING節をに限定しようとしていることです。は、8以下のアイテムの合計を持つordernoを引き出します。クエリは実行されますが、アイテムの合計が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

私は2つの可能な問題があります。まず、数字を8の代わりに文字列'8'と比較しています。 SQLサーバーが物事をどのように解釈するかによって、10のような数字が8未満として扱われる可能性があります。

これは簡単な問題です。あなたはそうです場合は、より大きな問題は、以下の8より大きくない合計数を持っている注文をしたいようにあなたがGROUP BYを使用する場合は、あなたの説明から、それは...

を鳴らし、(sum()のような)凝集体は内カウントグループ。つまり、RXNUMで表示しているため(つまりSELECT)、合計はRXNUMであり、オーダーごとではありません。それぞれRXNUMのレコードを取得したいが、全体を集計してORDERNOに基づいてフィルタを適用する場合は、ここで行っている処理よりもややこしい。

SUM()の代わりにSUM() OVER()を使用できます。しかし、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コードを書くのは事実上不可能です。現実には、あなたがすぐに、日付/時刻データを扱う場合は、特定の方言で作業することになります。特定の方言で作業したら、まったく新しい言語と同じように、その方言に慣れておくことをお勧めします。そして、プログラミング言語を学ぶことの一部は、少なくともその言語の規則に慣れるための試みでなければなりません。 –

関連する問題