2

MS Access 2010 で、4 つの異なるテーブルのデータを 1 つの列に結合するクエリを作成する必要があります。

テーブルは以下のように定義されています。

Table 1: date, country, channel, calls_in
Table 2: date, country, channel, calls_out
Table 3: date, country, channel, email
Table 4: date, country, channel, chat

クエリは次のようになります。

Query 1: Date, country, channel, contacts 

連絡先列は、適切な日付、国、およびチャネルの 4 つの連絡先タイプ (つまり、calls_in/out、電子メール、およびチャット) を組み合わせる必要があります。

4 つのテーブルはすべて、日付と国が同じです。チャネルは各テーブルに固有です。

私はこれを成し遂げようとしてきましたが、頭を悩ませることができません。

4

3 に答える 3

2

使用UNION(暗黙的に区別)またはUNION ALL

SELECT date, country, channel, 'calls_in' AS ContactType, calls_in AS ContactData
FROM table1
UNION ALL
SELECT date, country, channel, 'calls_out', calls_out        
FROM table2
UNION ALL
SELECT date, country, channel, 'email', email
FROM table3
UNION ALL
SELECT date, country, channel, 'chat', chat
FROM table4;

これにより、4つのテーブルのすべてのデータContactTypeが、3つのタイプのcalls_in新しい列とともに提供されcalls_out、それらのデータemailchat組み合わされます。

于 2013-01-25T12:42:41.163 に答える
2

あなたはこの後かもしれません:

SELECT
  all_contacts.date,
  all_contacts.country,
  all_contacts.channel,
  "calls in: " & [calls_in] & ", calls out: " & [calls_out] & ", email: " & [email] & ", chat " & [chat] AS contacts
FROM
  ((((select date, country, channel from [Table 1] union
      select date, country, channel from [Table 2] union
      select date, country, channel from [Table 3] union
      select date, country, channel from [Table 4])  AS all_contacts
  LEFT JOIN [Table 1] ON (all_contacts.channel = [Table 1].channel) AND (all_contacts.country = [Table 1].country) AND (all_contacts.date = [Table 1].date))
  LEFT JOIN [Table 2] ON (all_contacts.channel = [Table 2].channel) AND (all_contacts.country = [Table 2].country) AND (all_contacts.date = [Table 2].date))
  LEFT JOIN [Table 3] ON (all_contacts.channel = [Table 3].channel) AND (all_contacts.country = [Table 3].country) AND (all_contacts.date = [Table 3].date))
  LEFT JOIN [Table 4] ON (all_contacts.channel = [Table 4].channel) AND (all_contacts.country = [Table 4].country) AND (all_contacts.date = [Table 4].date);

MS-AccessはFULLOUTERJOINSをサポートしておらず、GROUP_CONCATのような集計関数を持っていないため、すべての日付、国、チャネルをすべてのテーブルに含むUNIONサブクエリに参加することになります。すべての連絡先(calls_in、calls_out、email、chat)を1つのセルに結合します。

于 2013-01-25T12:47:57.347 に答える
1

Mahmoudの答えを少し改善したいと思います:

SELECT date, country, channel, calls_in, 'Calls_in' as ContactType  FROM table1
UNION ALL
SELECT date, country, channel, calls_out, 'Calls_out' as ContactType FROM table2
UNION ALL
SELECT date, country, channel, email, 'email' as ContactType FROM table3
UNION ALL
SELECT date, country, channel, chat, 'Calls_in' as ContactType FROM table4;

しかし、データベースが何らかの正規化を行うことができることは明らかです。データベースを変更できる場合は、すべてのデータを 1 つのテーブルに簡単に配置して、使用した通信の種類を追跡するフィールドを作成できます。

于 2013-01-25T12:51:23.623 に答える