【问题标题】:How to get all the rows in a record?如何获取记录中的所有行?
【发布时间】:2018-03-27 22:27:33
【问题描述】:

如何将发生在一个人身上的所有事件排成一行?

示例:(没有任何意义,只是举例)

Id Name   Event    Date
1  John   Running  2017/09/13
2  Mary   Sleeping 2017/08/21
3  Karl   Sleeping 2017/07/30
1  John   Tired    2017/10/16
2  Mary   Playing  2017/10/16

我想得到如下结果:

Id Name   Event              Date
1  John   Running, Tired     2017/10/16
2  Mary   Sleeping, Playing  2017/10/16
3  Karl   Sleeping           2017/07/30

事件记录按事件日期升序显示。

最后它应该返回所有这些事件行的最大日期

【问题讨论】:

标签: sql sql-server


【解决方案1】:

最简单和最快的方法是在一个普通的 SELECT 中聚合一个 STUFF 命令中的所有事件。 这可能具有最快的执行时间:

SELECT
  aggregateevents.Name,
  Event = STUFF
  (
    (
      SELECT ', ' + Event
      FROM myawesomeeventstable eventlist
      WHERE eventlist.Name = aggregateevents.Name
      FOR XML PATH('')
    ),
    1,
    2,
    ''
  ),
  MAX(Date) 
FROM
  myawesomeeventstable aggregateevents 
GROUP BY
  aggregateevents.Name

【讨论】:

    【解决方案2】:

    您应该使用XML 方法和STUFF 函数来生成Single Row 数据:

    SELECT T.ID,
           T.Name,
           STUFF(
                (
                    SELECT ','+[EVENT]
                    FROM <table_name>
                    WHERE ID = T.ID FOR XML PATH('')
                ), 1, 1, '') [Event],
           REPLACE(MAX([Date]), '-', '/') [Date]
    FROM <table_name> T
    GROUP BY T.ID,
             T.NAME
    ORDER BY ID;
    

    结果:

       ID          Name      Event              Date
    ----------- --------- ------------------ ------------
       1           John      Running,Tired      2017/10/16
       2           Mary      Sleeping,Playing   2017/10/16
       3           Karl      Sleeping           2017/07/30
    

    【讨论】:

      【解决方案3】:

      您的表格数据

      select * into #tab from (
      select 1  id,'John'as Name ,  'Running'  [Event],'2017/09/13' [Date]
      union all
      select 2 , 'Mary'   ,'Sleeping', '2017/08/21'
      union all
      select 3,  'Karl'  , 'Sleeping', '2017/07/30'
      union all
      select 1,  'John',   'Tired' ,   '2017/10/16'
      union all
      select 2 , 'Mary' ,  'Playing' , '2017/10/16'
      )as a 
      

      查询

      select distinct id,Name,stuff (
      (select ','+[Event] from #tab where [id]=t.id for xml path('')),1,1,'')as Event,max([date]) Date_
      from #tab t
      group by id,Name
      order by id
      

      期望的输出

      Id Name   Event              Date
      1  John   Running, Tired     2017/10/16
      2  Mary   Sleeping, Playing  2017/10/16
      3  Karl   Sleeping           2017/07/30
      

      【讨论】:

        【解决方案4】:
        SELECT DISTINCT B.id, Name, MAX(Date) Date,
            substring(
                (
                    SELECT ','+A.Event  AS [text()]
                    FROM yourtable A
                    WHERE A.Id = B.Id
                    ORDER BY A.Id
                    For XML PATH ('')
                ), 2, 1000) Event
        FROM yourtable B
        GROUP BY B.Id, Name
        

        输出

        id  Name    Date                    Event
        1   John    2017-10-16T00:00:00Z    Running,Tired
        3   Karl    2017-07-30T00:00:00Z    Sleeping
        2   Mary    2017-10-16T00:00:00Z    Sleeping,Playing
        

        SQL 小提琴:http://sqlfiddle.com/#!6/2fd81/13/0

        【讨论】:

          【解决方案5】:

          试试这个:

          select Name, Event = STUFF((SELECT ', ' + Event
              FROM events b 
              WHERE b.Name = a.Name
              FOR XML PATH('')), 1, 2, ''), max(Date) 
          from events a 
          group by Name
          

          here 抓取的列表聚合。

          不知道你打算如何聚合 Id,所以我省略了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-24
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多