- ベストアンサー
データーベースのことなんですが・・・・。
a,123,あいうえお a,123,あいうえお b,456,かきくけこ b,456,かきくけこ c,789,さしすせそ c,789,さしすせそ という物を3つの表からSQLでselectしました。 これを、 a,123,あいうえお a b,456,かきくけこ b c,789,さしすせそ c と言う風に2行ずつ同じ値なので1列目はすべて表示ですが2列目3列目は上の行だけCSVに表示するように出力したいのです。 この場合SQLで変更しないといけないのでしょうか? VCのプログラムで変更しようとしましたが、イマイチ良く分かりません。構造体を2つ作り、一つはselectしたすべての値を受け取り、もう一つは値a,b,cの値をコピーしif(a[0]!=a[-1])だったら出力、if(a[0]==a[-1])だったら改行としていますが、関係なくすべて出力されてしまいます。なぜでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
テーブル名が ITEM_TBL カラム名がそれぞれ ColumnA,ColumnB,ColumnC だとします。 SQL文を SELECT ColumnA,ColumnB,ColumnC,Count(*) FROM ITEM_TBL GROUP BY ColumnA,ColumnB,ColumnC とすると、同じレコードの件数がCount(*)のところにはいるので、それをプログラムで取得して、1行目は全列のデータを書き出し、それ以降は残りの件数分だけColumnAを書けばできると思います。
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#3回答者です。 #3は、ソートされた順序で検索されることが前提なので、select文で「order by 列1,列2,列3」という指定が必須になります。
お礼
ありがとうございます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
n番目の行とn+1番目の行を比較した処理は、一般的にはSQLでやるより、アプリケーション側でやった方が、処理が単純で性能も確保できます。 <処理の流れ例> sv列1,sv列2,sv列3←存在し得ない値 ↓ <label1> DBのデータ受け取り。End Of Dataならループを抜ける ↓ 列1,列2,列3と、sv列1,sv列2,sv列3を比較 一致なら、列1の値のみ出力 不一致なら、列1~3を出力、sv列1~3←列1~3の値 ↓ <label1>に戻る
お礼
ありがとうございます。
- haratom
- ベストアンサー率36% (15/41)
プログラムで制御することも可能ですが、SQLを変更したほうが簡単に出来ると思います。 ご存知だと思いますが、重複を排除するSQLの書き方に以下の2パターンがあります。要求に合わせてどちらかを使うとよいかと思われます。 A. 列の値がすべて同じ行を取り除きたい場合 → DISTINCTを使う 2. ある特定の列の値が同じものをグループ化したい場合 → GROUP BYを使う
お礼
ありがとうございます。
お礼
ありがとうございます。