2

私は現在、以下に示す形式で SQL データベースに格納されているデータを利用する必要があるプロジェクトに取り組んでいます。

私がする必要があり、役立つツールを見つけるのに苦労しているのは、このデータを取得して、ID とイベント日付をキーにした複数列の単一レコードを作成することです。イベント ドリブン ハンドラーに関する情報をネットで見つけましたが、問題は、私のラベルには "イベント" と表示されていますが、実際に格納されているのは "イベント" と呼ばれる個々のデータであり、常にではありませんが、多くの場合、実際には個々のエントリであるということです。同時にエントリーされ、イベント全体のエントリーに貢献します。これが少し混乱しているように思われる場合は申し訳ありませんが、変更を制御できないシステムで作業しているため、データを有効に理解する必要があります。

これは、単一のレコードに変換する必要があるデータベースに格納されているものの実行例です。

ID      Event           Event Result  Event Result Value            Event Date      Entered By
909909  Status Change       No          no                          10/25/12 23:10  Doe, John
909909  Disposition         Remuni      Remains in place            10/25/12 23:10  Doe, John
909909  Event duration      15mins      15mins                      10/25/12 23:10  Doe, John
909909  Event end time      23:25       23:25                       10/25/12 23:10  Doe, John
909909  Event start time    23:10       23:10                       10/25/12 23:10  Doe, John
909909  Event type          Iniqrs      Initial System activation   10/25/12 23:10  Doe, John

次の単一レコードに。

ID      Event Start Event End   Moved               Action Taken                Entered By
909909  23:10       23:25       Remains in place    Initial System activation   Doe, John

どうぞよろしくお願いいたします。

4

2 に答える 2

1

Postgresが「地球上で最高のデータベースエンジン」であるというBaileyS.に同意しますが、SQLServerを使用していることもわかります。

必要なMSSQL関数は「ピボット」関数と呼ばれ、ドキュメントはここにあります。

最初に設定するのは少し難しいかもしれませんが、それは完全に実行可能であり、あなたが探している結果をあなたに与えるでしょう。


または、「自己結合」と呼ばれる手法があり、次のようになります。

SELECT
    [T1].[ID],
    [StatusChange].[EventResultValue] AS 'StatusChange',
    [Disposition].[EventResultValue] AS 'Disposition',
    ...
FROM
    (
        SELECT DISTINCT
            [EventsTable].[ID]
        FROM
            [EventsTable]
    ) AS [T1] LEFT OUTER JOIN
    [EventsTable] AS [StatusChange] ON [T1].[ID] = [StatusChange].[ID] AND [StatusChange].[Event] = 'Status Change' LEFT OUTER JOIN
    [EventsTable] AS [Disposition] ON [T1].[ID] = [Disposition].[ID] AND [Disposition].[Event] = 'Disposition' LEFT OUTER JOIN
    ...

ちょっとした警告:この手法を使用すると、句
にリストされるたびにテーブルが呼び出されます。FROM複数の列が必要な場合、またはテーブルに多数のレコードがある場合は、パフォーマンスが低下する可能性があります。


別のオプションは、groupとcaseステートメントを一緒に使用することです。

SELECT
    [ID],
    MAX(CASE WHEN [Event] = 'Status Change' THEN [EventResult] ELSE NULL END) AS [Event Start],
    MAX(CASE WHEN [Event] = 'Disposition' THEN [EventResult] ELSE NULL END) AS [Event End]
    ...
FROM
    [EventsTable]
GROUP BY
    [ID]

警告の大きなビット:
この手法を使用すると、ごとに1つのレコードのみが返されることが保証され[ID]ます。同じタイプのイベントが複数ある場合(つまり、特定のIDに対してイベントの開始時刻が2回表示される可能性がある場合は、これらのレコードの一部が返されないため、これを使用しないでください。

于 2012-10-31T20:52:25.733 に答える
0

このようなシナリオのために私が突破したいトリックがあります。アイデアは、データを1つのIDにグループ化することです。と組み合わせて使用​​するMAX()場合CASEは、基本的に、そのグループ内の目的の行から値を選択し、それを結果セットの列に変換できます。
クエリは次のとおりです。

select
  id,
  max(case when Event = 'Event start time' then [Event Result Value]
    else null end) as [Event Start],
  max(case when Event = 'Event end time' then [Event Result Value]
    else null end) as [Event End],
  max(case when Event = 'Disposition' then [Event Result Value]
    else null end) as [Moved],
  max(case when Event = 'Event type' then [Event Result Value]
    else null end) as [Action Taken],
  max([Entered By]) as [Entered By]
from Table1
group by id, [Event Date]

そして、ここでそれが実際に機能しているのを見ることができます。

これは特定の制約を前提としていることに注意してください。つまり、各id, [Event Date]組み合わせには次のものしかありません。

  • 1つの一意の[入力者]値
  • Event='イベント開始時刻'の1行
  • Event='イベント終了時間'の1行
  • Event='Disposition'の1行
  • Event='イベントタイプ'の1行

注: このクエリは。でグループ化されていEvent Dateます。これは、同じ日付で異なる時刻のレコードが別のグループの一部と見なされることを意味します。これは、同じ日のタイムスタンプが2つの異なる時刻のレコードのセットが2つある場合に、必要に応じて機能します。反対に、タイムスタンプがわずかにずれている場合、目的のグループからレコードを除外すると、やけどを負う可能性があります。グループのタイムスタンプが一貫していることを確認する必要があります。

于 2012-10-31T20:31:27.410 に答える