3

私はテーブルワーカーを持っています

id          name                                                                 
----------- ------------------- 
5           Артур Петрович                                         
6           Дмитрий Белов                                         
7           Казарян Артур  

そして別のテーブル

id          date       amount      id_worker
----------- ---------- ----------- -----------
27          2013-09-12 1500        5
28          2013-09-12 100         6
29          2013-09-12 500         5
30          2013-09-12 500         6
31          2013-09-14 1000        7
32          2013-09-15 100         5
33          2013-09-15 200         5

入力で開始日と終了日を取得し、出力で次の場合にこのテーブルを取得するストアドプロシージャを作成したい: 開始日:2013-09-10
終了日:2013-09-15

Name            2013-09-10 2013-09-11 2013-09-12 2013-09-13 2013-09-14 2013-09-15
_______________ __________ __________ __________ __________ __________ __________
Артур Петрович           0          0       2000          0          0        300
Дмитрий Белов            0          0        600          0          0          0
Казарян Артур            0          0          0          0       1000          0
4

1 に答える 1

3

私がこれを行う唯一の方法は、を使用することです。テーブル構造が事前にわかっている場合Dynamic SQL、IMO のリスクはありません。SQL Injection

DECLARE @DateList VARCHAR(MAX), @DateListCoalesced VARCHAR(MAX)
SELECT @DateList = '', @DateListCoalesced = ''
;WITH DateLimits AS (
  SELECT CAST('2013-9-10' AS DATE) AS dt
  UNION ALL
  SELECT DATEADD(dd, 1, dt)
    FROM DateLimits s
   WHERE DATEADD(dd, 1, dt) <= CAST('2013-9-15' AS DATE))
SELECT @DateList =  @DateList + '[' + CAST(dt AS VARCHAR)+ '], ' ,
    @DateListCoalesced = @DateListCoalesced + ' COALESCE( [' + CAST(dt AS VARCHAR)+ '] , 0) as [' + CAST(dt AS VARCHAR)+ '], ' 
  FROM DateLimits

;SET @DateList = LEFT(@DateList, LEN(@DateList) - 1)
;SET @DateListCoalesced = LEFT(@DateListCoalesced, LEN(@DateListCoalesced) - 1)


DECLARE @query NVARCHAR(max)
SET @query = N'SELECT [Name], ' +  @DateListCoalesced +'
FROM   
    (SELECT [Name], [Date], [Amount] 
     FROM WorkerAmount
     INNER JOIN Worker ON WorkerAmount.id_worker = Worker.id
    ) p
    PIVOT
    (
        Sum ([Amount] )
        FOR [Date] IN ( '+ @DateList +' )
    ) AS pvt '

EXEC sp_executesql @Query

この回答では、他のいくつかの質問を組み合わせて使用​​しています

于 2013-09-15T15:59:40.920 に答える