【问题标题】:SQL PIVOT for days of the week一周中的几天的 SQL PIVOT
【发布时间】:2013-07-30 13:12:59
【问题描述】:

我正在尝试获取本周的以下输出 -

Full Name    | Mon           | Tue  | Wed           | Thu  | Fri  | Sat  | Sun
Peter Smith  | 09:00 - 12:00 | NULL | 08:30 - 13:00 | NULL | NULL | NULL | 10:00 - 12:13
Peter Smith  | 13:00 - 17:00 | NULL | 14:30 - 16:00 | NULL | NULL | NULL | 13:00 - 17:14
Paul Stevens | 09:00 - 12:00 | NULL | 08:30 - 13:00 | NULL | NULL | NULL | 10:00 - 12:13

这是在日志中显示打卡,从表中提取 -

**ClockInLogs**
ID - INT
UserID - INT
ClockDateTimeIn - DateTime
ClockDateTimeOut - DateTime
Status - INT (ClockedIn/ClockedOut)

源数据 -

ID | UserID | ClockDateTimeIn         | ClockDateTimeOut        | Status
1  | 10000  | 2013-07-30 13:40:39.913 | 2013-07-30 13:42:20.113 | 0
2  | 10000  | 2013-07-30 14:13:10.947 | 2013-07-30 14:25:15.570 | 0
3  | 10001  | 2013-07-30 14:13:52.817 | 2013-07-30 14:25:19.063 | 0

全名是从名为 Users 的连接表中提取的。

任何想法如何获得所需的输出?我知道我需要做 PIVOT,但不知道如何在单元格中显示时间。

谢谢!

【问题讨论】:

  • 源数据实际上是什么样的?
  • 我已将源数据添加到问题中。谢谢
  • ClockDateTimeIn 和 ClockDateTimeOut 总是同一天吗?
  • 是的,总是在同一天。如果用户忘记打卡,则会在每天晚上 23:30 运行一个脚本来自动打卡用户打卡。

标签: sql sql-server sql-server-2008 pivot pivot-table


【解决方案1】:
declare @test table (ID int, UserID int, ClockDateTimeIn datetime, ClockDateTimeOut datetime, [Status] bit)
declare @user table (ID int, Name nvarchar(128))

insert into @test
select 1, 10000, '2013-07-30 13:40:39.913', '2013-07-30 13:42:20.113', 0 union all
select 2, 10000, '2013-07-30 14:13:10.947', '2013-07-30 14:25:15.570', 0 union all
select 3, 10001, '2013-07-30 14:13:52.817', '2013-07-30 14:25:19.063', 0 union all
select 3, 10001, '2013-07-29 10:13:52.817', '2013-07-30 18:25:19.063', 0

insert into @user
select 10000, 'Martin Smith' union all
select 10001, 'Paul Stevens'

;with CTE as 
(
    select
        u.Name,
        left(datename(weekday, t.ClockDateTimeIn), 3) as Col,
        convert(nvarchar(5), t.ClockDateTimeIn, 108) + ' - ' + convert(nvarchar(5), t.ClockDateTimeOut, 108) as Value,
        row_number() over (partition by u.Name, datename(weekday, t.ClockDateTimeIn) order by t.ClockDateTimeIn) as ID
    from @test as t
        left outer join @user as u on u.ID = t.UserID
)
select P.*
from CTE as C
pivot 
(
    min(Value) for Col in ([Mon], [Tue], [Wen], [Thu], [Fri], [Sat], [Sun])
) as P
order by Name, ID

SQL FIDDLE EXAMPLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2013-12-17
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多