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