0

表 1 (Resv)

ResvID  |  ResvDateTime           | BufferInd
-----------------------------------------------
   1    | 2012-06-11 08:30:00.000 |    1
   2    | 2012-06-11 08:30:00.000 |    2
   4    | 2013-07-20 12:00:00.000 |    1
   5    | 2013-07-20 12:00:00.000 |    2

注: ResvID(int identity)ResvDateTime(datetime)

表 2 (バッファ)

BufferInd  |  BufferPeriod (minutes)
---------------------------------
   1       |     60
   2       |     120

注: BufferInd(int)BufferPeriod(int)

pivotSQLビューで以下の両方の結果を使用して、これら2つのテーブルを結合したいと思います

 ResvID |     ResvDateTime        |  BufferInd1   |     BufferInd2          
---------------------------------------------------------------------
   1    | 2012-06-11 08:30:00.000 |       1       |         2
   2    | 2013-07-20 12:00:00.000 |       1       |         2 

.

 ResvID |     ResvDateTime        |  DateTimeAfterOneHour   |     DateTimeAfterTwoHour          
--------------------------------------------------------------------------------------
   1    | 2012-06-11 08:30:00.000 | 2012-06-11 09:30:00.000 | 2012-06-11 10:30:00.000 
   2    | 2013-07-20 12:00:00.000 | 2013-07-20 13:00:00.000 | 2013-07-20 14:00:00.000 

ノート:

DateTime1 = DateAdd(hour, BufferPeriod/60, ResvDateTime)WHEREBufferInd = 1

DateTime2 = DateAdd(hour, BufferPeriod/60, ResvDateTime)WHEREBufferInd = 2

そして、これはテーブル内のすべての変数を宣言する私の試みですが、失敗しました。

Create Table Resv
  ([ResvID] int, [BufferTypeInd] int ,[ResvDT] datetime, [BufferPeriod] int)
;

Insert Into Resv
  ([ResvID], [BufferTypeInd], [ResvDT], [BufferPeriod])
Values
  (1, 1, '2012-06-11 08:30:00.000', 60),
  (2, 2, '2012-06-11 08:30:00.000', 180),
  (4, 1, '2013-07-20 12:00:00.000', 60),
  (5, 2, '2013-07-20 12:00:00.000', 180),
;

私のピボットトライ:

SELECT *
FROM
(
  (SELECT 
      [BufferTypeInd], [ResvDT], [BufferPeriod]
    FROM Resv)
  
) AS source

PIVOT
(
    MAX([ResvDT])
    FOR [BufferTypeInd] IN ([1],[2],[3])
) as pvt;


SELECT ResvID,
     MAX(
    CASE WHEN 
      BufferTypeInd = '1' 
    THEN 
      DateAdd(hour, BufferPeriod, ResvDT) 
    ELSE 
      NULL 
    END) [1],

    MAX(
    CASE WHEN 
      BufferTypeInd = '2' 
    THEN 
      DateAdd(hour, BufferPeriod, ResvDT) 
    ELSE 
      NULL 
    END) [2]
FROM Resv
GROUP BY ResvID

My SQL Fiddle Try (リンク)

私の問題を指摘し、ピボットと集計機能をどのように行うべきかを教えてください.ありがとう.

4

1 に答える 1

2

ノート:

あなたのスキーマは意味がありません。ResvDT 列だけで予約を組み合わせている場合は、気まぐれすぎます。同時に 2 つの留保は、ピボットの目的で区別できなくなります。ResvID 列は、同じ予約に対して同じであると想定しています。それ以外の場合、ResvDT がそれ自体で一意である場合は、以下のクエリで PIVOT ソースから削除できます。

データ

Create Table Resv
  ([ResvID] int, [ResvDT] datetime, [BufferTypeInd] int)
;

Insert Into Resv
  ([ResvID], [ResvDT], [BufferTypeInd])
Values
  (1, '2012-06-11 08:30:00.000', 1),
  (1, '2012-06-11 08:30:00.000', 3),
  (1, '2012-06-11 08:30:00.000', 4),
  (2, '2013-07-20 12:00:00.000', 1),
  (2, '2013-07-20 12:00:00.000', 3),
  (2, '2013-07-20 12:00:00.000', 4)
;

Create Table Buffer
 (BufferTypeInd int, BufferPeriod int)
;

Insert into Buffer values
 (1, 60),
 (3, 180),
 (4, 240);

クエリ

 declare @cols nvarchar(max), @names nvarchar(max);
  select @cols = isnull(@cols + ',', '')
               + QuoteName(RTrim(BufferPeriod)),
         @names = isnull(@names + ',', '')
                + QuoteName(RTrim(BufferPeriod))
                + ' as DateTimeAfter' + RTrim(BufferPeriod) + 'Minutes'
    from Buffer
order by BufferPeriod;

 declare @nsql nvarchar(max);
  select @nsql = N'
SELECT ResvID, ResvDT, ' + @names + '
FROM
(
  (SELECT R.ResvID, R.[ResvDT], B.[BufferPeriod],
          DateAdd(minute,B.BufferPeriod,R.ResvDT) TimeAfter
     FROM Resv R
     JOIN Buffer B on B.BufferTypeInd = R.BufferTypeInd)

) AS source
PIVOT
(
    MAX(TimeAfter)
    FOR [BufferPeriod] IN (' + @cols + ')
) as pvt';

    exec (@nsql);

結果

| RESVID |                      RESVDT |      DATETIMEAFTER60MINUTES |     DATETIMEAFTER180MINUTES |     DATETIMEAFTER240MINUTES |
----------------------------------------------------------------------------------------------------------------------------------
|      1 | June, 11 2012 08:30:00+0000 | June, 11 2012 09:30:00+0000 | June, 11 2012 11:30:00+0000 | June, 11 2012 12:30:00+0000 |
|      2 | July, 20 2013 12:00:00+0000 | July, 20 2013 13:00:00+0000 | July, 20 2013 15:00:00+0000 | July, 20 2013 16:00:00+0000 |

SQL フィドル

于 2013-05-17T03:18:18.030 に答える