2011-08-10 16 views
0

私の指示は、最も量の多いINV_LINE_ITEM.FK_InvoiceNbrを表示することです。私は次のクエリのさまざまなバリエーションで取り組んできましたHAVING/GROUP BY句のブール型でない問題

SELECT INV_LINE_ITEM.FK_InvoiceNbr 
FROM INV_LINE_ITEM 
GROUP BY INV_LINE_ITEM.FK_InvoiceNbr 
HAVING MAX(INV_LINE_ITEM.Quantity); 

私は「近くに、「条件が期待されているコンテキストで指定された非ブール型の式を、エラーを受信し続けます。 ''このエラーが何を意味するのか、コードを修正する方法がわからない私も使ってみました

SELECT 
STR(ILI.InvoiceNbr, 4) AS 'Invoice Number' 
FROM INV_LINE_ITEM ILI 
GROUP BY 
ILI.FK_InvoiceNbr, ILI.Quantity 
HAVING MAX(ILI.Quantity) 
+1

私はあなたの指示を解読しようとしています。 InvoiceがQuantityの最高値を持つ行を返すことを意味していますか?または、1つの行ではなく請求書ごとに1つの行が表示されるため、各請求書に対して最高の数量を持つ明細を照会しようとしていますか? –

答えて

3

最も効率的なクエリではないかもしれませ。次のクエリが役立つかどうかを確認します。

SELECT TOP 1 FK_InvoiceNbr 
      , MAX(Quantity) AS MaxQuantity 
FROM   INV_LINE_ITEM 
GROUP BY  FK_InvoiceNbr 
ORDER BY  MaxQuantity DESC 

この方法でも書き込むことができます。

SELECT TOP 1 FK_InvoiceNbr 
FROM   INV_LINE_ITEM 
GROUP BY  FK_InvoiceNbr 
ORDER BY  MAX(Quantity) DESC 
+0

それはうまくいった。だから、私はここで何が起こっているのか理解してもらいましょう。 "TOP 1"は結果を1つの行に限定しているので、FK_InvoiceNbrとMAX(Quantity)はINV_LINE_ITEMから選択されます。 元のクエリで実行しようとしていたように、HAVING節を使用できませんでしたか? ああ、ありがとうございました。 – krebshack

+0

これはおそらくOPが望んでいたものです。 –

+0

これは意味があります。私は、ブール式が何だったのかと、それらがHAVING節でどのように使われたのかを調べるのではなく、私が得ていたエラーを調べることで問題に遭遇したと思います。 – krebshack

0

MAXを使って達成しようとしていることはわかりません。 MAXはそのグループのその列の最大値を持ち、その内部の式と同じ型であることを知っておく必要があります。

正しい句は、あなたがそれをtrueまたはfalseに評価さ何かを作るためにあなたのMAX句に何かを追加する必要が

Having max(field) = 3 
0

のように気にいらないでしょう。例えば

HAVING MAX(ILI.Quantity) > 1000 
0

持つことはちょっと条件のようなものです。構文はこのようになります

HAVING MAX(INV_LINE_ITEM.Quantity) > 3; 

しかし、それはあなたが望む条件ではありません。

私が何をしたいことはこれはあなたに最高の数量を持ってINV_LINE_ITEM.FK_InvoiceNbrを与えるこの

SELECT INV_LINE_ITEM.FK_InvoiceNbr 
FROM INV_LINE_ITEM 
ORDER BY INV_LINE_ITEM.Quantity DESC 
LIMIT 1 

だと思います。

0

HAVINGは、集約しているグループに関する集約属性に関する条件をチェックしています。

WHEREが行の条件をチェックするのと同じように、HAVINGはGROUP BYで指定したグループに従って行の集計条件をチェックします。

通常、これは、100以上の子供または100以上の価値のある製品を販売している店舗を表示するためのものです。

あなたはそのために探しているように見えません - あなたは最大の数量を持つグループ(実際にはいなくてもグループが、請求書)を探しています:

WITH x AS (
    SELECT INV_LINE_ITEM.FK_InvoiceNbr, RANK() (OVER BY INV_LINE_ITEM.Quantity DESC) AS rnk 
    FROM INV_LINE_ITEM 
) 
SELECT * FROM x WHERE rnk = 1 

これがあれば倍数を与えます彼らはRANKのために結びついている。 DENSE_RANKとROW_NUMBERの分析関数もあります。behave a little differentlyです。

あなたは最高量で各請求書内の行を望んでいた場合:

WITH x AS (
    SELECT INV_LINE_ITEM.FK_InvoiceNbr, RANK() (OVER BY INV_LINE_ITEM.Quantity DESC PARTITION BY INV_LINE_ITEM.FK_InvoiceNbr) AS rnk 
    FROM INV_LINE_ITEM 
) 
SELECT * FROM x WHERE rnk = 1