4

約 5 億行のデータを含む SQL Server 2008 R2 データベースがあります。現在、次のようになっています。

ID          Eventtype
201         1
201         3
201         4
201         1
201         1
664         1
664         0
664         1
664         3

この形式でデータを返すクエリが見つからないようです。

ID         Event0   Event1  Event2  Event3  Event4
201        0        3       0       1       1
664        1        2       0       1       0

これは、私がこの時点で得た限りです:

select distinct ID as ID, count(EventType)
from database.dbo.events 
group by questID, EventType

次のようにデータを吐き出します:

ID       EventType
201      0
201      3
201      0
201      1
201      1
664      1
664      2
664      0
etc.

これにより、必要なすべてのデータが表示されますが、どれがどれであるかを把握しようとする際の書式設定と当て推量EventTypeが非常にイライラします。

データを適切な形式で返すより良いクエリを提案できる人はいますか?

4

2 に答える 2

4

のようなものはどうですか...

select ID, sum(Event0), sum(Event1), sum(Event2), sum(Event3), sum(Event4)
from (
    select ID, 
        case EventType when 0 then 1 else 0 end as Event0,
        case EventType when 1 then 1 else 0 end as Event1,
        case EventType when 2 then 1 else 0 end as Event2,
        case EventType when 3 then 1 else 0 end as Event3,
        case EventType when 4 then 1 else 0 end as Event4
    from dbo.events
) E
group by ID
  • 0から4までの番号が付けられたイベントタイプが正確に5つあると仮定します。
  • テーブルのインデックス作成方法によっては、かなりの量のソートスペースが必要になる場合があり、十分なスペースが利用できない場合は失敗する可能性があります。
于 2012-06-13T00:03:04.757 に答える
4

SQLServerにはピボット機能があります。たとえば、6つの異なるイベントがある場合は、次を使用できます。

select ID, [0], [1], [2], [3], [4], [5]
from events
pivot 
(
  -- aggregate function to apply on values
  count(EventType) 
  -- list of keys. If values of keys are not fixed,
  -- you will have to use dynamic sql generation 
  for EventType in ([0], [1], [2], [3], [4], [5])
) pvt

動的ピボット生成については、このSO投稿を参照してください。

ところで、私はあなたの元のクエリが読むべきだと信じています:

select ID, EventType, count(EventType)
from events 
group by ID, EventType
order by ID, EventType

Sql Fiddleで実際に動作していることを確認できます(下にスクロールしてピボット結果を確認してください)。

于 2012-06-13T00:06:00.697 に答える