sql - 每天列中两个日期之间的数据

标签 sql sql-server-2008 date

我有 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/

相关文章:

mysql - GROUP BY 子句中列的顺序重要吗?

sql - 基于NULL值的表列排序

sql-server-2008 - 使用 SQL Server Management Studio 访问 SQL Server 2008 R2 Express

sql-server-2008 - 在 SQL Server 2008 上使用筛选索引删除/插入失败?

javascript - Chrome 的 toLocaleFormat 的替代品是什么?

javascript - XDate 与 Datejs

sql - 统计员工出勤率

sql - 将编译后的 Linq To SQL 与 ExecuteMethodCall 结合使用

mysql - 尝试通过添加连接在一张表中获得 2 个总和

mysql - SQL排序月份升序和月份降序?