システムwiki

同じIDの2つの行のデータを1つの行にマージしたい

Timbuck 受付中 最終更新日:2022-06-24 21:50

私はExcelからデータをインポートしましたが、IDは最大3つの異なるテストでスコアを上げることができます.Accessクエリですべてをまとめると、1つのスコアが1行目にあり、他の2つは2行目にあります.3つすべてを同じ行に表示するにはどうすればよいですか.グループ化を試みましたが、変更はありませんでした.

返信リスト(回答:3)

1 #
KenSher

リレーショナルデータベースは、スプレッドシートとはまったく異なる方法でデータを格納するため、後者から前者にデータをインポートする場合は、データを再構築する必要があります.提供したサンプルデータから、あるエンティティタイプの3つの属性があるように見えます.最初の3列で、etと呼び、a1、a2、a3.他の3つの列は、3つのテストのスコアを表しているとのことです.s1、s2、s3と呼びます.

リレーショナルデータベースでは、これは2つのtableでモデル化されます.1つはエンティティタイプetをモデル化し、列はa1、a2、a3です.主キーをa1と仮定しますが、データから、最初の3列は候補キーであり、ファイナルtableの単一の一意のインデックスに含める必要があるようですet.

スコアと呼ぶ2番目のtableには、ta1が含まれます.em>、およびsと呼ぶスコアの列.もちろん、これらは実際の列名ではなく、それぞれが列によって表される属性を説明します.

まず、tableetに、次のような「追加」クエリを使用して個別の行を入力する必要があります.ここで、TestScoresは元のtableの名前です.

INSERT INTO et(a1、a2、a3)

SELECT DISTINCT a1、a2、a3

FROM TestScores;

次に、関連するtableに次のような3つの追加クエリを入力する必要があります.

INSERT INTOスコア(a1、t、s)

SELECT a1、 "Test1"、s1

TestScoresから

WHEREs1はNULLではありません.

INSERT INTOスコア(a1、t、s)

SELECT a1、 "Test2"、s2

TestScoresから

WHEREs2はNULLではありません.

INSERT INTOスコア(a1、t、s)

SELECT a1、 "Test3"、s3

TestScoresから

WHEREs3はNULLではありません.

これで、2つの関連するtableの正しく構造化されたセットができたので、主キー列と外部キー列a1に関係を作成し、参照整合性を適用できます.もちろん、Test1、Test2、Test3の代わりに、3つのテストに任意の名前を使用できます.必要な形式で結果tableを返すには、1行に3つのスコアがあり、単純なクロス集計クエリが必要です.

PS: よく調べてみると、参照されるエンティティタイプには4つの属性があることがわかりました.そのため、a4列をtableに追加する必要がありますet.

2 #
dhookom

私はあなたの繰り返しの列に関して他の人に同意します.ただし、次のような合計クエリを試すことができます:

SELECT FieldA、FieldB、FieldC、Max(FieldD)as D、Max(FieldE)as E、Max(FieldF)as F

FROM YourTableName

GROUP BY FieldA、FieldB、FieldC

3 #
theDBgu

これが唯一の方法ではないかもしれませんが、それを行う1つの方法は、テストごとに個別のクエリを作成し、最後のクエリを1つ使用して、それらすべてを1つに結合することです.