2

私は2つのテーブルを持っています

Name    | ID      | 
--------+---------+
A       | 3       | 
A       | 5       | 
B       | 1       | 



 ID     | Count   | 
--------+---------+
1       | 10      | 
2       | 50      | 
3       | 15      | 
6       | 20      | 

これら 2 つのテーブルの ID を結合し、一致しないエントリの結果を集計するものを生成したい

Name    | ID      | Count
--------+---------+----------
A       | 3       | 15
A       | 5       | 0 *//(doesn't exists)*
A       | others  | 80 *//(10 (ID 1) + 50 (ID 2) + 20 (ID 6))*
B       | 1       | 10
B       | others  | 85 *//(50 (ID 2) + 15 (ID 3) + 20 (ID 6))*

今まで、一致したアイテムを取得できましたが、一致していない集計を取得できませんでした。

exceptID の各リストに対して を実行し、一致しないものを集約することは、エレガントな解決策ではないと感じています。

問題に対するよりエレガントな解決策を見つけたいと思います。

編集: を使用していることを忘れていましたSQL server。オラクルのソリューションは、私のシナリオでは役に立ちませんが、Oracle ユーザーの同様のシナリオでは役に立ちます。

4

3 に答える 3

0

LINQ ソリューションは次のとおりです。

from n in Names
join c in Counts on n.ID equals c.ID into outer
select new { n.Name, 
             ID = outer.Count() > 1 ? "others" : n.ID.ToString(),
             Sum = ((int?)outer.Sum(x => x.Count)) ?? 0 }

これは外部結合と同等の機能を果たしますが、 anullをに変換するトリックもあり0ます。linq-to-sql では、これはうまく SQL に変換されます。また、SQL に変換されるため、 isのouter.Count()ときに例外がスローされません。outernull

于 2013-09-11T07:35:15.683 に答える
0

オラクルの場合は nvl を使用します。フルアウターの代わりに左と右のアウターのユニオンを使用したSQLサーバーのifnull()およびmysql isnull()

select name, id, sum(cnt) from
(
select name, nvl(to_char(a.id), 'others') id, nvl(b.count,0) cnt 
from table1 a 
     full outer join 
     table2 b on a.id = b.id)
group by name, id
于 2013-09-11T07:29:12.157 に答える