Sql server SQL Pivot(?)-按天展平/选择事件以包含一整周的列

Sql server SQL Pivot(?)-按天展平/选择事件以包含一整周的列,sql-server,Sql Server,我希望有人能帮助我弄清楚如何使用显示的表展平select,以便我可以为每个用户选择一行,其中包含每个事件的列 简言之,我正在创建下面的临时表,其中包含特定用户在给定的一周内要参加的活动 CREATE TABLE #ByEvent (WeekBegin SMALLDATETIME NOT NULL, UserNo INT NOT NULL, Name VA

我希望有人能帮助我弄清楚如何使用显示的表展平select,以便我可以为每个
用户选择一行,其中包含每个事件的列

简言之,我正在创建下面的临时表,其中包含特定用户在给定的一周内要参加的活动

CREATE TABLE #ByEvent
       (WeekBegin        SMALLDATETIME      NOT NULL,
        UserNo           INT                NOT NULL,
        Name             VARCHAR(30)        NOT NULL,
        Attend           BIT                NOT NULL,               
        --- Event Portion ---------------------------   
        EventID          INT                NOT NULL,
        EventDate        SMALLDATETIME      NOT NULL,
        Hrs              NUMERIC(4,2)       NOT NULL,
        EventScheduleBeg SMALLDATETIME      NOT NULL,
        EventScheduleEnd SMALLDATETIME      NOT NULL,               
        Val1             VARCHAR(1)         NOT NULL,
        Val2             VARCHAR(1)         NOT NULL)   
请参见下面的示例表内容。为了清晰起见,我已将一些值缩减为相关部分:

WeekBegin   UserNo  Name   Attend EventID EventDate  Hrs  ScheduleBeg  ScheduleEnd
2018-05-27  24      Jim    T      257     5/29/18    4.0  12:00        16:00  
2018-05-27  24      Jim    T      258     5/29/18    2.0  18:00        20:00
2018-05-27  24      Jim    T      259     5/30/18    2.5  12:00        14:30   
2018-05-27  24      Tim    F      259     5/30/18    2.5  12:00        14:30   
我需要的是输出如下所示的数据。然而,我很难理解如何实现这一点。我相信我需要一个轴心(如果我在错误的轨道上并且过于复杂,请让我知道),但在给定的一周内可能没有或有5个以上的事件,因此我不知道我需要在select语句中提前显示多少列。希望这是有道理的。如果有人给我指出正确的方向,我会非常感激

SELECT WeekBegin
      ,UserNo
      ,Name
      ,Attend
      ,FirstEventID
      ,FirstEventDate
      ,FirstEventHrs
      ,FirstEventScheduleBeg
      ,FirstEventScheduleEnd
      ,FirstVal1
      ,FirstVal2
      ,SecondEventID
      ,SecondEventDate
      ,SecondEventHrs
      ....

这会让你开始,但你真的应该为问题添加更多细节。首先,事件的数量似乎没有硬性限制,您可能更希望只拥有必要的列。动态SQL解决方案能够实现这一点,但如果您确实需要在列前面加上“First”、“Second”、“Third”等前缀,那么您还需要克服另一个小障碍

顺便说一句,有很多方法可以按周分组,在5月份硬编码一个随机日期可能不是您在生产代码中实际使用的方法

;with data as (
    select *,
        datediff(week, cast('20180527' as date)) as WeekNo,
        row_number() over (
            partition by UserNo order by EventDate, ScheduleBeg) as RN
    from #ByEvent
    where EventDate >= cast('20180527' as date)
)
select WeekNo, UserNo, ...
    case when RN = 1 then EventID end as FirstEventID, ...
    case when RN = 2 then EventID end as SecondEventID, ...
from data
group by WeekNo, UserNo;