我有 table 工
id name
----------- -------------------
5 Артур Петрович
6 Дмитрий Белов
7 Казарян Артур
还有一张 table
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
最佳答案
我知道这样做的唯一方法是使用动态 SQL
,IMO 没有 SQL 注入(inject)
的风险,如果表结构提前已知的话
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
这个答案结合了其他几个问题
关于sql - 每天列中两个日期之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18812456/