0

我想将多行合并为一个,但是当某个值出现在字段中时会有一个新行,请参见下面的示例数据

数据当前在表中的方式

IncomingNumber  QueNumber Datetime
--------------  --------- -------------------
12345678        1         2012-01-01 09:01:00
12345678        2         2012-01-01 09:02:00
12345678        3         2012-01-01 09:05:00
12345678        2         2012-01-01 09:07:00
12345678        3         2012-01-01 09:08:00
12345678        1         2012-01-01 09:10:00
12345678        2         2012-01-01 09:11:00
12345678        3         2012-01-01 09:13:00
09876543        1         2012-01-01 09:01:00
09876543        2         2012-01-01 09:02:00
09876543        1         2012-01-01 09:05:00
09876543        2         2012-01-01 09:06:00
09876543        3         2012-01-01 09:08:00

我希望数据看起来如何

IncomingNumber  Datetime1            Datetime2            Datetime3            Datetime4            Datetime5
--------------  -------------------  -------------------  -------------------  -------------------  -------------------
12345678        2012-01-01 09:01:00  2012-01-01 09:02:00  2012-01-01 09:05:00  2012-01-01 09:07:00  2012-01-01 09:08:00
12345678        2012-01-01 09:10:00  2012-01-01 09:11:00  2012-01-01 09:13:00  Null                 Null
09876543        2012-01-01 09:01:00  2012-01-01 09:02:00  Null                 Null                 Null
09876543        2012-01-01 09:05:00  2012-01-01 09:06:00  2012-01-01 09:08:00  Null                 Null 

因此,每次在 QueNumber 字段中出现 1 时,它都是一条新记录。我知道它与 CTE 查询有关,但我从来没有真正使用过它们并且完全被卡住了

4

1 回答 1

3

欢迎来到 StackOverflow。如果您发布 DDL 和示例数据以帮助他们帮助您,它通常会帮助其他人。这是您的表格数据。

create table tbl (IncomingNumber int,QueNumber int,Datetime datetime);
insert tbl values
    (12345678 ,1 ,'2012-01-01 09:01:00'),
    (12345678 ,2 ,'2012-01-01 09:02:00'),
    (12345678 ,3 ,'2012-01-01 09:05:00'),
    (12345678 ,2 ,'2012-01-01 09:07:00'),
    (12345678 ,3 ,'2012-01-01 09:08:00'),
    (12345678 ,1 ,'2012-01-01 09:10:00'),
    (12345678 ,2 ,'2012-01-01 09:11:00'),
    (12345678 ,3 ,'2012-01-01 09:13:00'),
    (09876543 ,1 ,'2012-01-01 09:01:00'),
    (09876543 ,2 ,'2012-01-01 09:02:00'),
    (09876543 ,1 ,'2012-01-01 09:05:00'),
    (09876543 ,2 ,'2012-01-01 09:06:00'),
    (09876543 ,3 ,'2012-01-01 09:08:00');

以下查询为您提供所需的内容,最多 5 个日期时间列。如果任何行产生超过 5 列,则不会显示额外内容。我使用了一种很容易让您扩展的模式。从下往上数,您只需要更改第 2 行和第 4 行即可满足更多日期时间列。

;with c1 as (
    select *,rn=ROW_NUMBER() over (partition by IncomingNumber order by DateTime)
    from tbl
), c2 as (
    select IncomingNumber,1 row,1 col,rn,DateTime
    from c1
    where rn=1
    union all
    select c1.IncomingNumber,
            case when c1.QueNumber=1 then c2.row+1 else c2.row end,
            case when c1.QueNumber=1 then 1 else c2.col+1 end,
            c1.rn,
            c1.DateTime
    from c2
    join c1 on c1.IncomingNumber=c2.IncomingNumber and c1.rn=c2.rn+1
)
select IncomingNumber,[1][DateTime1],[2][DateTime2],[3][DateTime3],[4][DateTime4],[5][DateTime5]
from(select IncomingNumber,row,col,DateTime from c2)p
pivot(max(DateTime)for col in([1],[2],[3],[4],[5]))v
order by IncomingNumber,row
于 2012-10-05T04:41:36.817 回答