将SQL日期转换为时间卡列(动态)

3
Name   Date                           Duration
------ ------------------------------ ---------------------------------------
Leiuck 02/23/2014                     12.50
Annver 02/24/2014                     8.00
Leiuck 02/24/2014                     9.00
Mauler 02/24/2014                     8.00
Shaman 02/24/2014                     4.00
Annver 02/25/2014                     8.00
Leiuck 02/25/2014                     8.50
Mauler 02/25/2014                     8.00
Shaman 02/25/2014                     6.00
Annver 02/26/2014                     8.00
Leiuck 02/26/2014                     8.50
Shaman 02/26/2014                     7.00
Annver 02/27/2014                     8.00
Shaman 02/27/2014                     6.00

我需要按日期排列的列,并将持续时间作为结果。
select
    Name = left( per.Name, 3) + right( per.Name, 3)
,   Date = convert( varchar, t.EntryDate, 101)
,   Duration = sum(t.Duration)
from tentry t (nolock)
left join tpers per (nolock) on t.PersonID = per.PersonID
where
    t.EntryDate >= dateadd(wk, datediff(wk, 0, getdate()) -0, -1)
and t.EntryDate <= dateadd(wk, datediff(wk, 0, getdate()) -0,  5)
and per.Division = 1
and per.Act = 1
group by
    per.Name
,   t.EntryDate

请帮忙。

更多信息...

我需要的输出结果类似于这样。非常感谢您的帮助。

Name    2/23/2014   2/24/2014   2/25/2014   2/26/2014   2/27/2014
Annver              8           8           8           8
Leiuck  12.5        9           8.5         8.5         
Mauler              8           8                       
Shaman              4           6           7           6

你的表中的Duration列是什么类型? - user2989408
一天中所花费的时间。一个整数。 - Rob
1
听起来像是巫术...或者是一个PIVOT查询。 - Hart CO
1
如果提供样例数据、期望输出和您的尝试,则加1分。 - M.Ali
2个回答

2
DECLARE @Cols NVARCHAR(MAX);
DECLARE @Sql NVARCHAR(MAX);

SELECT @Cols = STUFF((SELECT DISTINCT ', ' + QUOTENAME([Date]) 
                      FROM TableName 
                      FOR XML PATH(''),TYPE).
                      value('.','NVARCHAR(MAX)'), 1, 2,'')
FROM TableName t


SET @Sql = N'SELECT *
             FROM TableName t
             PIVOT (SUM(Duration)
                    FOR [Date]
                    IN ('+ @Cols +')
                    )p'

EXECUTE sp_executesql @Sql

结果集

╔════════╦════════════╦════════════╦════════════╦════════════╦════════════╗
║  Name  ║ 2014-02-23 ║ 2014-02-24 ║ 2014-02-25 ║ 2014-02-26 ║ 2014-02-27 ║
╠════════╬════════════╬════════════╬════════════╬════════════╬════════════╣
║ Annver ║ NULL       ║ 8.00       ║ 8.00       ║ 8.00       ║ 8.00       ║
║ Leiuck ║ 12.50      ║ 9.00       ║ 8.50       ║ 8.50       ║ NULL       ║
║ Mauler ║ NULL       ║ 8.00       ║ 8.00       ║ NULL       ║ NULL       ║
║ Shaman ║ NULL       ║ 4.00       ║ 6.00       ║ 7.00       ║ 6.00       ║
╚════════╩════════════╩════════════╩════════════╩════════════╩════════════╝

可运行的 SQL FIDDLE


好的回答...我想通过删除空值来做出贡献...http://sqlfiddle.com/#!3/2059a/29 希望没问题。 - sam yi
太好了!我知道我最初没有要求,但是否有办法添加没有数据的日期?您可以在我的原始请求中看到日期范围。 - Rob
要添加不存在的日期,您需要将它们添加到透视查询中使用的列列表中,可以通过手动追加它们来实现,或者可以创建一个驱动表/CTE,其中包含您感兴趣的所有日期,以代替从表中提取日期。 - Hart CO

1
DECLARE @cols AS VARCHAR(1000),
        @query  AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT DISTINCT ',' +   QUOTENAME([date]) 
                    FROM Table1
                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                    ,1,1,'')

SET @query = '
              SELECT * 
              FROM  Table1 
              PIVOT (max(Duration) for [Date] in ('+@cols+')) p
            '
EXEC (@query)

演示:SQL Fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接