【问题标题】:Combine multi rows into one but have new row based on value将多行合并为一,但根据值有新行
【发布时间】:2012-10-04 21:40:53
【问题描述】:

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

数据当前在表中的情况

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 查询有关,但我从来没有真正使用过它们并且完全被卡住了

【问题讨论】:

  • 您是否正在寻找基于 QueNumber 排序中的任何中断的新记录。就像 QueNumber 3 后面跟着一个 2 一样?
  • 这是sql-server 2012的,只有QueNumber为1时才需要新记录

标签: sql common-table-expression sql-server-2012


【解决方案1】:

欢迎来到 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 行即可满足更多的 datetime 列。

;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

【讨论】:

  • 哇,效果非常棒,非常感谢,如果可以的话,我会给你买一品脱的。你是如何学会正确的 sql 查询的,我只是不知道从哪里开始
  • 您好,还有一个问题,如果我需要添加在 quenumber 为 3 且其余时间为 null 时具有值的运算符列,我将如何将其添加到数据透视表中
  • 没关系,我已经想出了怎么做一次心痛感谢您的帮助
猜你喜欢
  • 2022-01-13
  • 2018-06-13
  • 1970-01-01
  • 2014-06-19
  • 2017-08-23
  • 1970-01-01
  • 2019-01-11
  • 2018-08-14
  • 2020-03-28
相关资源
最近更新 更多