1

私はこのようなcsvファイルを持っています

**0, xyz, 20130301121212
1, 6997, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
1, 6647, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
9, 8**

0 の行はヘッダー、1 は別の店舗、2 は製品の詳細レコードです。

2 (最初の列) の行は、行 1 (最初の列) の店舗の詳細です。

これらの行を 2 でグループ化し、対応する 1 でグループ化する方法を教えてください。

4

2 に答える 2

0

私は SQL Server を使用していないため、一般的なガイダンスしか提供できません。

1)ファイルをデータベースにロードし、行全体を列にロードし、行の行番号を追加します。結果は次のようになります (ridは行番号):

rid rline
1   1, 6997, 01234
2   2, 012345, 5678999, Y, 11, 20130301
3   2, 012345, 5678988, Y, 11, 20130301
4   1, 6647, 01234
5   2, 012345, 5678999, Y, 11, 20130301
6   2, 012345, 5678988, Y, 11, 20130301

2) SQL を使用して、必要な形式のデータを取得します。これは、2 の行ごとに 1 の最初の前の行を見つける必要があることを意味します。テストされていません:

select 
    csvdata.rline,
    csvdata.rid,
    (select rline from csvdata x where rline like '1,%' and x.rid < csvdata.rid order by x.rid desc limit 1) as TopRline
from 
    csvdata
where
    rline like '2,%' -- this will limit lines to only those with the detail

うまくいけば、これにより 3 つの列で次の結果が生成されます。

rid rline                                 TopRline      
2   2, 012345, 5678999, Y, 11, 20130301   1, 6997, 01234
3   2, 012345, 5678988, Y, 11, 20130301   1, 6997, 01234
5   2, 012345, 5678999, Y, 11, 20130301   1, 6647, 01234
6   2, 012345, 5678988, Y, 11, 20130301   1, 6647, 01234

3) いくつかの SQL 関数を使用してデータを列に分割します (たとえば、PostgreSQL ではtext_to_array()これを行います)。2 の結果がテーブル temp に格納されていると仮定すると、次のようになります。

select
  (string_to_array(rline,','))[1] as column1,
  (string_to_array(rline,','))[2] as column2,
  (string_to_array(rline,','))[3] as column3,
  (string_to_array(rline,','))[4] as column4,
  (string_to_array(rline,','))[5] as column5,
  (string_to_array(rline,','))[6] as column6,
  (string_to_array(TopRline,','))[1] as column1top,
  (string_to_array(TopRline,','))[2] as column2top,
  (string_to_array(TopRline,','))[3] as column3top,
from
  temp

4) 必要なテーブルにデータを保存します。

于 2013-03-28T12:22:26.367 に答える