2011-08-16 9 views
0

データベースにフィールドが多すぎるため、いくつかのテーブルをmsアクセスで圧縮する必要があります。どのような現在の線に沿って何かでいる:私はテーブルが見えるように必要なものMSAccessでのデータ行の結合

ID  Class  Date  
123 101  1/1/1111 
123 202  2/2/2222 
123 303  3/3/3333 
456 111  4/4/4444 
456 222  5/5/5555 
456 333  6/6/6666 

はこれです:

ID  Class(1) Date(1) Class(2) Date(2) Class(3) Class(3) ..... etc 
123 101  1/1/1111 202   2/2/2222 303   3/3/3333 ..... etc 
456 111  4/4/4444 222   5/5/5555 333   6/6/6666 ..... etc 

IDによるエントリの標準数はありませんし、データの一部繰り返してもよい。これを行う方法はありますか?

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

+0

['TRANSFORM..PIVOT'ステートメント](http://msdn.microsoft.com/en-us/library/bb208956(v=office.12).aspx)を参照してください。 – onedaywhen

答えて

1

私は、逆の例を持っていると思います(あなたが持っているものと必要なもの)。

このデータの適切な表形式は、水平ではなく垂直です(最初の例のように)。 (水平に表示する場合は、プレゼンテーションの目的でクエリを実行することもできますが、実際にはそのような構造にする必要はありません)。

水平フォーマットを変換するには、

INSERT INTO myNewTable 
(ID, class, date) 

SELECT 
    ID, 
    Class(1), 
    Date(1) 
FROM 
    myOldTable 
WHERE 
    Class(1) IS NOT NULL 

UNION 

(ID, class, date) 
SELECT 
    ID, 
    Class(2), 
    Date(2) 
FROM 
    myOldTable 
WHERE 
    Class(2) IS NOT NULL 

UNION 

... 
+0

残念ながら私は私が行く大学の教授のためにこれを書いています。彼らはテーブルを持っていなければなりませんが、なんらかの理由でそれはそうしてはいけない方法であることを望みます。彼らが望むことをする方法を知っていますか? – user897308

+0

あなたの教授は、特定の方法(DAO、ADO、SQLなど;クエリ、レポートなど)でそれをやりたがっていますか? – Chains

+0

Nope。彼女はちょうどそれが完了したい。ファイルはMS Accessです。 – user897308

1

私はあなたに私が問題にアプローチかもしれない方法のアイデアを与えるだろう...これはアプローチのabstractible /再利用可能な関数型ではありません - ちょうど実用的な、一種-終ら-それを物の

)古いテーブルをバックアップ用にコピーします。

1)元のテーブルに一意のレコード識別子を与えます。テーブルデザインに「pk」という列を追加し、小さなキーのボタンをクリックします。保存した後は、自動増分された整数が入力されていることを確認してください。

2)pk、id、class1、date1、class2、date2、...、classn、datenの列を持つ新しいテーブルを作成します。あなたが作成する必要があるフィールドの数を簡単に見るには

を実行することができます。

2)#1

Insert into newtable (pk, id, class1, date1) 
select min(pk) id, class, date from oldtable 

3を挿入行う)#1

Delete from oldtable 
where pk in(select pk from newtable) 

4を削除行う)#1

Update newtable a 
set a.pk = b.pk, a.class2 = b.class, a.date2 = b.date 
FROM (select min(pk) pk, id, class, date from oldtable) b 

5を更新行う)(#2を削除しません手順3を繰り返してください)

6)更新する2ステップ4では、2を3に変更します)。私:

Update newtable a 
set a.pk = b.pk, a.class3 = b.class, a.date3 = b.date 
FROM (select min(pk) pk, id, class, date from oldtable) b 

...など古いテーブルに残ったレコードがなくなるまで続きます。

私は言った - これは再利用することはできません、あなたはすべてのループなどでそれを変更する必要があります。もしあなたがADOレコードセットなどを使用する方法を知っていれば、使用可能ですが、複数回使用するようには聞こえません。

幸運。

+0

btw - 完了後、新しいテーブルのpkカラムを削除できます。古いテーブルからの削除に役立つだけです。その後、あなたはそれを必要としません。 – Chains