1

SQL で遭遇した問題は、ID にリンクされている 1 つの列から他の 3 つの列にデータをエクスポートしようとしたことですが、下の図に示すように、多くの NULLS と複数の同一の IDS になってしまいました。

私は 4 列のテーブルを持っています。これらの列では、データが非常に奇妙な方法で格納されています。私のテーブルはこんな感じ

entry_id| field_id |      value                 | value_ID |
|    480|       -5 |      string of text| 10    |
|    480|      -20 |      string of other text  | 10       | 
|    480|      -23 |      Yes                   | 10       |
|    480|      -22 |      No                    | 10       |

フィールド ID を、値が付加された新しい列に変換するクエリを設計しました。

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

 SELECT 
 ticket.ticket_id,
 ticket.number,
 users.name,

 CASE WHEN val.field_id IN (5) THEN val.value end as "Issue Summary",
 CASE WHEN val.field_id IN (20) THEN val.value end as "Project Site",
 CASE WHEN val.field_id IN (23) THEN val.value end as "Action"

 FROM ost_ticket ticket

 LEFT JOIN ost_form_entry entry ON (ticket.ticket_id = entry.object_id)
 LEFT JOIN ost_form_entry_values val ON (entry.id = val.entry_id)
 LEFT JOIN ost_user users ON (ticket.user_id = users.id)
 LEFT JOIN ost_form_field fields ON (val.field_id = fields.id)

このクエリは次を返します: http://i.stack.imgur.com/hqBv0.png (評判がないため画像を埋め込むことができません。)

ご覧のとおり、同一のチケット ID が複数あり、多数の NULLS があります。一意の ticket_id ごとに 1 つの行のみを保持するには、どのクエリを使用すればよいですか?

4

1 に答える 1

0

あなたが望むのは、フィールド値を1行で取得することだと思います:

SELECT 
 ticket.ticket_id,
 ticket.number,
 users.name,
 issue_sum.value as "Issue Summary",
 project_site.value as "Project Site",
 action.value as "Action"
 FROM ost_ticket ticket
 LEFT JOIN ost_form_entry entry ON (ticket.ticket_id = entry.object_id)
 LEFT JOIN ost_form_entry_values issue_sum 
     ON (entry.id = issue_sum.entry_id) and issue_sum.field_id = 5
 LEFT JOIN ost_form_entry_values project_site 
     ON (entry.id = project_site .entry_id) and project_site.field_id = 20 
 LEFT JOIN ost_form_entry_values action 
     ON (entry.id = action.entry_id) and action.field_id = 23
 LEFT JOIN ost_user users ON (ticket.user_id = users.id)
 LEFT JOIN ost_form_field fields ON (val.field_id = fields.id)

チケットごとに複数のエンティティ レコードを持つことができることを考えると、私が提案できる唯一のことは、集計を使用することです。

  SELECT 
     ticket.ticket_id,
     ticket.number,
     users.name,
     MAX(issue_sum.value) as "Issue Summary",
     MAX(project_site.value) as "Project Site",
     MAX(action.value) as "Action"
     FROM ost_ticket ticket
     LEFT JOIN ost_form_entry entry ON (ticket.ticket_id = entry.object_id)
     LEFT JOIN ost_form_entry_values issue_sum 
         ON (entry.id = issue_sum.entry_id) and issue_sum.field_id = 5
     LEFT JOIN ost_form_entry_values project_site 
         ON (entry.id = project_site .entry_id) and project_site.field_id = 20 
     LEFT JOIN ost_form_entry_values action 
         ON (entry.id = action.entry_id) and action.field_id = 23
     LEFT JOIN ost_user users ON (ticket.user_id = users.id)
     LEFT JOIN ost_form_field fields ON (val.field_id = fields.id)
GROUP BY  
     ticket.ticket_id,
     ticket.number,
     users.name;
于 2014-08-29T09:28:32.730 に答える