2012-03-17 10 views
0

私は1つのxから多くのyのSQLサーバーデータベースに1対多のリレーションシップを持っています。親ローが重複しないSQLジョイン

私は2つのテーブルを結合するときのように、私はデータを取得します。それに関連付けられた2つの子供の列があるので、私は二回xデータを取得

1x 1x 1y 1y 
1x 1x 2y 2y 

問題は、両方のテーブルにあるカラムで合計を実行する必要があることです。それぞれのユニークなローの列を1回だけ合計したい場合があります。したがって、私はこのようなデータがほしいと思う:

これはサブクエリでは非常に簡単に行うことができますが、パフォーマンス上の問題があります。

ありがとうございました。

編集 -

誰もがより具体的な例望んでいるので:

をお店のいくつかの種類に発注の非常に大きなテーブルがあります。 これらの注文には割引が適用されます。複数の注文に割引を適用できます。 各注文には、トップレベルの税、配送、およびディスカウントの合計列があります。 各注文には、子供注文品のコレクションがあります。これらの受注明細には、品目価格と数量が販売されています。

各ディスカウントについて、合計売上高が必要です。 これは、ディスカウント税をかけた各注文の合計+各ディスカウント・シップに置かれた各注文の合計+各注文の合計注文数量*数量 - ディスカウント・トータルの合計です。

私は合計する必要がある2つのレベルがあります。注文のものと注文アイテムのもの。

テーブルは変更できません。

サブクエリで正しい数値を取得しましたが、合計の列をソートする必要があり、非常に遅いことがわかりました。

割引による現在のモデルグループが適用され、注文と注文アイテムが結合されます。非常に効率的ですが、1つ以上の子がある注文列の複製を返します。

+1

他のDBMSについてはわかりませんが、MySQLは 'COUNT(DISTINCT somefield)'をサポートしていますので、あなたはダストを数えません。 –

+0

フィールドは区別できない場合があります(IDとは別) – JonathanDHope

+1

他の制約なしでこれらの列に対して合計を実行する必要がある場合、なぜそれらを1つのクエリで結合しますか? *さらに制約がある場合は、それらを質問に追加してください。 –

答えて

3

サブクエリが目的の結果を返すことができる場合は、それを使用する必要があります。

常にデータベースの構造と要件によって異なります。サブ問合せがオーバーヘッドを追加することは必ずしも必要ではありません。

1

単純に言えば、各注文の合計費用を計算してから、割引でグループ化されたすべての注文の合計費用を合計します。

with orderTotals as (
select discountID, 
     min(tax + shipping - discount) + sum(price * quantity) as total 
    from orders 
    join items on orders.orderID = items.orderID 
group by discountID, orders.orderID 
) 
select discountID, 
     sum(total) as total 
    from orderTotals 
group by discountID 
; 

税、配送、および割引が与えられた順序のために一定であるので、あなたは、(分間MAX()または平均を()の代わり)と、まだ同じ結果を得ることができます。

+0

なぜ 'tax'、' shipping'、 'discount'を' group by'に含めなかったのだろうと思います。また、 'group by 'の' orderID'は2つのテーブルエイリアスのどちらかと共に指定されなければなりません。 (実際には、分かりやすくするために、CTEの各列名に対応するテーブル名を追加します。) –

+0

グループ内のorderIDは(固定)で絶対に正しいですし、すべての列にテーブル名を追加することは悪いことではありません。グループでの税金、送料、割引を含む方が効率的かもしれませんが、わかりません。 – dbenham

関連する問題