2012-03-23 13 views
0

SQLで構文の問題が発生しました。私がここでやろうとしているのは、各注文に支払われた金額のすべてを加算したもの(それぞれ支払済)と、特定の注文番号(1008)ごとに支払った金額の合計よりも大きいものだけを選択することです。私はここでたくさんの異なるものを移動しようとしてきましたが、私は運がありません。SQLネストされた場所(合計)

これは私が今持っているものですが、私はいろいろなものを持っています。これを使用しようとすると、正しく終了していないSQL文が返されます。皆さんが助けてくれるようなご支援をいただければ幸いです。どこでもDISTINCTを使用する必要がありますか?

SELECT ORDER#, 
    TO_CHAR(SUM(PAIDEACH), '$999.99') AS "Amount > Order 1008" 
FROM ORDERITEMS 
GROUP BY ORDER# 
WHERE TO_CHAR > (SUM (PAIDEACH)) 
WHERE ORDER# = 1008; 

答えて

2

SQLのバージョンによっては、ハッシュ文字(#)がコメントの先頭とみなされるものがあります。他は二重ハイフン(--)を使用しています。だから、私の最初の考えは、あなたのORDER#フィールドの名前が間違っているということです(ただし、エンジンでその名前のフィールドを作成させることはできません)。

あなたは2つのWHEREキーワードがありますが、これは許可されていません。 WHEREの条件が複数ある場合は、ブール論理を使用して、ANDORのキーワードを使用して条件をリンクする必要があります。

お客様のWHEREの条件はです。GROUP BYの後にする必要があります。 GROUP BYの前にWHEREの条件を指定してください。

あなたのWHERE条件の1つは意味をなさない。 TO_CHAR > (SUM(paideach)):TO_CHAR()は、数値型の値を指定されたフォーマットに従って文字列に変換するOracle関数です。 SQL Serverの同等の機能はCAST or CONVERTです。

特定の値を超える金額の注文を検索するクエリを作成しようとしていますが、WHERE条件の1つが注文番号を1008にするように指定しているため、あまり明確ではありません1レコードを返します。

問合せは、おそらくより次のようになります。

SELECT order, 
    SUM(paideach) AS amount 
FROM orderitems 
GROUP BY order 
HAVING amount > 999.99; 

これはpaideachの合計が999.99を超えorderitemsテーブルからレコードを選択することになります。

私はどのように注文1008が物事に収まるのか分かりませんので、あなたはそれを詳しく述べなければなりません。

+0

+1。列は '列# 'と呼ばれるので、私はそれが注文番号であると推測しています。それには 'where'節を追加してください。私はOPに彼の答えがあると思います! – Bridge

+0

私はそこにサブクエリがあると確信しています。それは何とか2つの 'where'節につながっています。私はそれが注文1008の合計であるよりも大きい合計 'paideach 'を持つすべての' order# 'を見つけることになっていると思います.999.99は単に比較のための値ではなく、出力の形式マスクです。 (そして 'order#'はOracleのフィールド名としてOKです; 'order'は予約語ではありません)。 –

0

は、私は、Oracleに精通していないよ、それは宿題ですので、私はあなたに答え、私が間違っていると思われるもののほんのいくつかのアイデアを与えることはありません。

  • select文は文が1持っている必要があります - ちょうど論理演算子(trueと評価何が含まれます)で区切られ、当然の複数の条件を持つことができます。例えば。 :声明によるWHERE (column1 > column2) AND (column3 = 100)

  • グループはWHERE

  • 後にあなたは彼らのエイリアス名で、同じ文のWHERE句での選択で別名まし列を参照することができないはずです。たとえば、これは動作しません:group byがある場合

    SELECT column1 as hello FROM table1 WHERE hello = 1

  • を、あなたが選択している列は、そのステートメント(またはそれらの集合体)と同じでなければなりません。 Thisページでは、これよりもわかりやすく説明しています。

1

他は、あなたのクエリに間違っていることのいくつかについてコメントしました。私はあなたが探していると思う結果を得るためにあなたがしなければならないと思っていることについて、より明確なヒントを与えるように努めます。

問題は、まずあなたが近くにいる各注文の合計を見つけ、個別のセクションに分割するようだと私はおそらくから始まっ思う:特定の注文の合計を見つける...

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT 
FROM ORDERITEMS 
GROUP BY ORDER#; 

SELECT SUM(PAIDEACH) 
FROM ORDERITEMS 
WHERE ORDER# = 1008; 

...あなたが詰まっている場所です。最も簡単な方法は、あなたが最近教えてくれたことですがGROUP BYの後ろにあるHAVING句を使用して、集約された列に適用できる種類のフィルタとして機能します( WHERE句)。

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT 
FROM ORDERITEMS 
GROUP BY ORDER# 
HAVING SUM(PAIDEACH) > 5; 

(@Bridgeはあなたが持つ句で、列の別名、AMOUNTを使用することはできません示されているように、あなたは集計関数SUMを繰り返す必要があることに注意してください):あなたはこれを行うことが一定量を持っていた場合。しかし、あなたは固定値を持っていないので、注文1008の実際の合計を使用したいので、その固定値を別のクエリに置き換える必要があります。私は最後の一歩を踏み出させます...