2017-09-10 6 views
0

だが、私は私のテーブルに次の行があるとしましょうマージされた行数を数える:は1つに異なる行をマージし、

ExternalID Count Descriptor 
    1   1  val-1 
    1   1  val-2 
    2   1  val-3 
    2   1  val-4 
    2   1  val-5 
    2   1  val-6 
    3   1  val-7 

私はこのような何かを達成する必要があるでしょう:

ExternalID Count  Descriptor 
    1   2  val-1, val-2 
    2   3  val-3, val-4, val-5 
    3   1  val-7 

うこのようなことは可能でしょうか?

+0

eaiserをお手伝いしてください。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Yunnosch

答えて

1

リレーショナルデータベースの利用可能な機能の可能性はありますが、おそらく完了したものではありません。

これは、関係のアドバンテージを利用する場合と非常によく似ています。

外部ID用のテーブルとDescriptors用のテーブルを考えてから、リンクテーブル(関連テーブルまたは他の多くの名前がリレーションシップを結ぶテーブルに使用します)を考えてみましょう。

CREATE TABLE externals (_id PRIMARY INTEGER KEY, extid INTEGER) 
CREATE TABLE descriptors (_id PRIMARY INTEGER KEY, descriptor TEXT) 
CREATE TABLE link_externals_to_descriptors (external_ref INTEGER NOT NULL, descriptor_ref INTEGER NOT NULL) 

だから上記(ノート私は、例示の目的のためにそれらを容易に区別するためのIDの10-12と100-106を使用しました)しているために: -

外観表

_id  extid 

10  1 
11  2 
12  3 
99  9 

記述子表

_id  descriptor 
100  val-1 
101  val-2 
102  val-3 
103  val-4 
104  val-5 
105  val-6 
106  val-7 

リンクテーブル(link_externals_to_descriptors)

external_ref   descriptor_ref 
1     100 
1     101 
2     102 
2     103 
2     104 
3     106 
99     100 
99     102 
99     104 
99     105 
99     107 

これは見えるかもしれませんし、非常に複雑かもしれないが、外部IDのと記述子の間の1対多、多対1、さらには多くの多の関係に対処します。

すなわち は、または非マージにマージする必要はないでしょう

(すべてのVal-6は、他の人が使用している除く)

9     val-1, val-3, val-5, val-6, val-7 

に相当しますcsvを個々のディスクリプタに分割します。あなたはあなたが望むものを手に入れるだけです。例えば

SELECT * FROM link_externals_to_descriptors WHERE external_ref = 99; 

クエリを駆動するために使用されると、カウント(行数)のカーソルが外部IDの記述子の数になります。そのようなものとして、以下の数および記述子(ログに情報を出力する)を取得するために使用することができる

: -

Cursor csr = db.query("link_externals_to_descriptors", 
    null, 
    "external_ref=?", 
    new String[]{"99"}, 
    null,null,null); 
int my_count_of_descriptors = csr.getCount() 
Log.d("MYINFO","The number of Descriptors for EXTID 99 is" + 
    Integer.toString(my_count_of_descriptors) + 
    " They are:-"); 
while(csr.moveToNext) { 
    Log.d("MYINFO","\t" + csr.getString(csr.getColumnIndex("descriptor_ref"))); 
} 
csr.close(); 
1

照会時グループごとに1つの出力行を取得するために、GROUP BYを使用して、そして、値をマージするaggregation functionsを使用:元Count値は問題場合は、SUM(Count)COUNT(*)を置き換える

SELECT ExternalID, 
     COUNT(*), 
     group_concat(Descriptor) 
FROM myTable 
GROUP BY ExternalID; 

関連する問題