2017-01-04 9 views
1

多くの回答がありますが、私の使用はありません。 私のテーブルには、私たちは与えられた時間に、ステータスのオンとオフメーターを保存SQL集計なしで列を列に変換する

enter image description here

のように見えました。すべてのオフステータスの後に、オンステータスがあります。私たちは、私はこのクエリこの

enter image description here

ようmeternoあたりの結果にのみ与え

SELECT * 
    FROM 
(
    SELECT MeterNo, Status, CreatedOn 
    FROM [BreakdownShutdowDetails] 
) s 
PIVOT 
(
    MAX(CreatedOn) FOR Status IN ([power off], [power on]) 
) p 

を試してみました

でこの

MeterNo |  [power off]  |   [power on] 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:14:37.610 | 2016-10-08 14:17:15.047 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:20:50.257 | NULL 
____________________________________________________________________ 
    x0039938 | 2016-10-08 14:23:07.610 | 2016-10-08 14:23:17.920 
____________________________________________________________________ 
    x0039940 | 2016-10-08 15:45:38.250 | 2016-10-08 15:52:40.080 
____________________________________________________________________ 

などのようなテーブルを移調したいですオフオンの状態とオフの間の時間を得るための基本的なアイデア各メーター。 正しいクエリをお勧めします。おかげさまで

アップデート1 サンプル・データ

1 x0039938 power off 2016-10-08 14:14:37.610 
2 x0039938 power on 2016-10-08 14:17:15.047 
3 x0039938 power off 2016-10-08 14:20:50.257 
4 x0039938 power off 2016-10-08 14:23:07.610 
5 x0039938 power on 2016-10-08 14:23:17.920 
6 x0039940 power off 2016-10-08 15:45:38.250 
7 x0039940 power on 2016-10-08 15:52:40.080 
8 x0040281 power off 2016-10-08 15:59:26.513 
9 x0040281 power on 2016-10-08 16:20:23.323 
10 x0039940 power off 2016-10-08 16:26:29.133 
19 x0040281 power off 2016-10-08 17:17:48.900 
22 x0039937 power off 2016-10-08 17:24:24.617 
23 x0039937 power on 2016-10-08 17:24:38.590 
24 x0039937 power off 2016-10-08 17:33:31.843 
25 x0039937 power on 2016-10-08 17:35:47.470 
27 x0039940 power off 2016-10-08 17:37:18.360 
28 x0040281 power on 2016-10-08 17:40:08.093 
30 x0043637 power off 2016-10-09 14:32:23.130 
31 x0039937 power off 2016-10-09 14:32:24.893 
32 x0040281 power off 2016-10-09 14:32:27.387 
33 x0039940 power off 2016-10-09 14:32:29.407 
34 x0040281 power on 2016-10-09 15:01:42.480 
+0

これはギャップと島の問題のようです。 –

+0

sql-serverのバージョンは何ですか? – Viki888

+0

@ Viki888 SQL Server 2008 –

答えて

1

これは、一般的にGaps and islands問題として呼ばれると呼ばれます。このようなものを試してください(テストされていません)

SELECT MeterNo, 
     [power off] = Min(CASE 
          WHEN status = 'power off' THEN CreatedOn 
         END), 
     [power on] = Min(CASE 
          WHEN status = 'power on' THEN CreatedOn 
         END) 
FROM (SELECT *, 
       Row_number() OVER (partition BY MeterNo ORDER BY CreatedOn) - 
       Dense_rank() OVER (partition BY MeterNo ORDER BY status) AS seq_grp 
     FROM Yourtable) t 
GROUP BY MeterNo, 
      seq_grp 
+0

サンプルデータが提供されました –

+0

@テスト済みですか? –

+0

ありがとうございました。 –