0

SQL Server 2008 R2 を使用しています。私は以下のようなテーブル構造を持っています:

Id (Identity): int  
GroupId:       int  
Field Id:      int  
Field Name:    nvarchar(1000)  
Value:         nvarchar(max)  

このテーブルは、キーと値のペア構造として表示できます。

したがって、UI に次のレコードがある場合:

Due Date    | Target Date       | Status  
-----------------------------------
5-Jun-2013  |       4-June-2013 | Pending  
10-Jun-2013 |       8-June-2013 | Completed  
15-Jun-2013 |      11-June-2013 | Pending  

データベースでは、各列は個別のレコードとして扱われます。したがって、データベースには次のものが含まれます。

Id  | Group Id  | Field Id  | Field Name    | Value  
-----------------------------------------------------------
1   | 1         | 1         | Due Date      | 5-Jun-2013  
2   | 1         | 2         | Target Date   | 4-Jun-2013  
3   | 1         | 3         | Status        | Pending  

4   | 2         | 1         | Due Date      | 10-Jun-2013  
5   | 2         | 2         | Target Date   | 8-Jun-2013  
6   | 2         | 3         | Status        | Completed  

7   | 3         | 1         | Due Date      | 15-Jun-2013  
8   | 3         | 2         | Target Date   | 11-Jun-2013  
9   | 3         | 3         | Status        | Pending  

データベースから取得しているときに、UI で表示されるのと同じ形式で出力を取得したいと考えています。テーブルに膨大な量のデータが含まれることを考えると、この結果を得る最良の方法は何ですか?

この点に関するヘルプは本当に役に立ちます。

4

2 に答える 2

1

これが良い設計であるかどうかにかかわらず、OP に示されているデータを使用して目的を達成できます。重要なのは、ID の違いが行を識別することに注意することです。明示的な「レコード」参照を設計に含める必要があることを強調しなければならないため、このメッセージをハックと呼びます。

select (id - FieldId),
       max(case when FieldName = 'DueDate' then value end) as DueDate,
       max(case when FieldName = 'TargetDate' then value end) as TargetDate,
       max(case when FieldName = 'Status' then value end) as Status
from t
group by (id - FieldId)

ところで、日付を文字列として格納する必要があるという事実は、データ構造に問題があることをさらに示しています。EAV 構造であっても、"ValueStr"、"ValueDate"、"ValueInt" を個別の列として使用して、異なる値を格納できます (または sqlvariant 型を使用できます)。

于 2013-06-14T09:28:03.043 に答える