2012-04-10 6 views
1

私はSQLを学ぶ旅の中で、私の古いデータベースにさまざまな質問を書いていますが、もっと複雑なものに取り組んでいます。私はテーブルエージェントを持っています。複数のエージェントが同じ都市にサービスを提供することができ、それぞれ異なる価格で提供されます。私は、最も高価な順序で任意の特定の都市のすべてのエージェントを雇うの総コストを返すクエリを実行したいと思います。このSELECTとORDER BYのクエリは、私が実行した最も効率的な方法ですか?

WITH orderedPrices AS (
    SELECT SUM(agtFMPrice) 
    OVER (PARTITION BY agtCity) 
    AS IX FROM Agent) 
SELECT IX 
FROM orderedPrices 
ORDER BY IX DESC 

私はorderedPricesによって返されたビューなしでそれをやって、それが(それは集約関数だ、またはそれらが呼び出されているものは何でもので、私は仮定)の価格を注文しないことがわかりました。私はこれを最善の方法でやったのか、それとも単純化できるのか?

また、特に退屈だと感じたら、この表で行う新しい割り当て/クエリを私に教えてください。私はその練習を使うことができた。

答えて

1

あなたが英語で書いたものは、あなたがSQLで書いたものと全く同じではないようです。

英語:
- City
ごとに1つのレコード - レコードごとに1つのフィールド、すべての関連する物質の総コストを示す

SQL:
- Agent
ごとに1つのレコード - レコードごとに1つのフィールド、同じ都市のすべてのエージェントの合計コストを表示

AgentID | agtCity | agtFMPrice 
---------+---------+------------ 
    1 | 1 |  10 
    2 | 1 |  20 
    3 | 2 |  30 
    4 | 2 |  10 
    5 | 2 |  25 


Results of SQL version   Results of English version 
------------------------   ---------------------------- 
      30        30 
      30        65 
      65 
      65 
      65 

英語版が必要な場合は、 Oこれは...

SELECT 
    agtCity, 
    SUM(agtFMPrice) AS IX 
FROM 
    Agent 
GROUP BY 
    agtCity 
ORDER BY 
    SUM(agtFMPrice) DESC 

パフォーマンスを支援するために、テーブルは(?必要があります)も​​

+0

おっと上のインデックスを持つことができ、それが詳細な回答、感謝だ、それは本当に私の間違いを指摘しています。私はまだSQLの把握はまだしていないようだ。だから、私のパーティションビットが原因だと思われる? – cost

+0

また、新しいクエリのおかげで、Nullコスト$ 14.50を学んだことがあります。 – cost

+0

'GROUP BY'は、複数のソース行のグループをグループごとに1行に集約します。次に、 'MIN/MAX/SUM/etc'を使って、各グループの複数行の単一集約結果を計算することができます。 'OVER(PARTITION BY)'は、集計を行を集約することなく指定することを可能にします。複数のソース行のすべてを保持しながら、単一の集計結果を複数のソース行に適用します。 – MatBailie

関連する問題