首页 > 解决方案 > SQL:从 3 条记录中获取数据并合并为一条

问题描述

我有一张表,每天有 3 条记录,用于 3 个班次段。我正在尝试每天将记录合并为一行。

数据目前如下所示:

ID    DayNum    Flag    SesNum    SesType    SesStart    SesEnd

1       1        Y        1         Reg       06:15       10:15
1       1        Y        2         Brk       10:15       11:15
1       1        Y        3         Reg       11:15       15:15
1       2        Y        1         Reg       05:00       11:00
1       2        Y        2         Brk       11:00       12:00
1       2        Y        3         Reg       12:00       15:00

我需要把每天的三个片段合并成一个记录。因此,包含三个段的每个 ID 中的每一天都有一行。我希望它看起来像这样:

ID    DayNum   Flag   S1_Type    S1_Start    S1_End    S2_Type    S2_Start    S2_End    S3_Type    S3_Start   S3_End

1       1       Y       Reg        06:15       10:15     Brk        10:15       11:15     Reg        11:15      15:15

我尝试了以下方法,它几乎就在那里:

Select *

FROM (

select 

a.WorkPatternID,
a.DayNo,
max(a.WorkedFlag) as 'WorkedFlag',
max(a.SessionType) as 'S1_Type',
max(a.SessionStart) as 'S1_Start',
max(a.SessionEnd) as 'S1_End',
max(b.SessionType) as 'S2_Type',
max(b.SessionStart) as 'S2_Start',
max(b.SessionEnd) as 'S2_End',
max(c.SessionType) as 'S3_Type',
max(c.SessionStart) as 'S3_Start',
max(c.SessionEnd) as 'S3_End'

FROM (  Select * 
        FROM WP_Patterns
        WHERE SessionNo = 1 ) a

Inner JOIN (    select * 
        FROM WP_Patterns
        WHERE SessionNo = 2 ) b
ON a.WorkPatternID = b.WorkPatternID

Inner JOIN (    select * 
        FROM WP_Patterns
        WHERE SessionNo = 3 ) c
ON a.WorkPatternID = c.WorkPatternID

GROUP BY a.WorkPatternID, a.DayNo

) t

WHERE WorkedFlag = 'Y'

但是我认为 max 函数忽略了 S2 和 S3 中的一天,因此返回所有天的最大时间,这不是我需要的。

任何关于清理这个烂摊子的帮助都会很棒!

标签: sqlsql-server

解决方案


您可以使用条件聚合:

select id, daynum, max(flag),
       max(case when sesnum = 1 then SessionType end) as s1_sessionType,
       max(case when sesnum = 1 then SessionStart end) as s1_ SessionStart,
       max(case when sesnum = 2 then SessionType end) as s2_sessionType,
       max(case when sesnum = 2 then SessionStart end) as s2_ SessionStart,
       max(case when sesnum = 3 then SessionType end) as s3_sessionType,
       max(case when sesnum = 3 then SessionStart end) as s3_ SessionStart
from WP_Patterns
group by id, daynum;

推荐阅读