【问题标题】:How can I use SQL GroupBy and Concatenate together?如何同时使用 SQL GroupBy 和 Concatenate?
【发布时间】:2015-11-23 09:14:25
【问题描述】:

目前有:

Time, Interaction, CustomerId  

1/5/2015, Facebook, 1    
1/12/2015, Mail, 3  
1/3/2015, Email, 1  
1/9/2015, Facebook, 1  
1/17/2015, Mail, 4  
1/1/2015, Mail, 1  

想要:

CustomerId, Interaction Path, Date Path  
1, Mail > Email > Facebook > Facebook, 1/1/2015 > 1/3/2015 > 1/5/2015 > 1/9/2015  
3, Mail, 1/12/2015  
4, Mail, 1/17/2015  

因此,交互路径和日期路径将按照从最早到最近日期的顺序排列。

非常感谢您的阅读。

【问题讨论】:

  • 你使用的是哪个数据库?

标签: sql group-by concatenation


【解决方案1】:

在 SQL Server 中:

create table my_table (Time date, Interaction varchar(50), CustomerId  int);

insert into my_table values
(N'1/5/2015',  'Facebook', 1 ),   
(N'1/12/2015', 'Mail'    , 3  ),
(N'1/3/2015',  'Email'   , 1  ),
(N'1/9/2015',  'Facebook', 1 ), 
(N'1/17/2015', 'Mail', 4  ),
(N'1/1/2015',  'Mail', 1  );

使用STUFFXML Path,您可以轻松做到这一点:

SELECT q1.Customerid + ', ' 
       + replace(q1.Interaction, ',', ' > ') 
       + ', ' + replace(q1.[Time], ',', ' > ') AS desired_output
FROM (
    SELECT DISTINCT cast(t2.CustomerId AS VARCHAR(10)) AS CustomerId
        ,STUFF((
                SELECT ',' + t1.Interaction
                FROM my_table T1
                WHERE T1.CustomerId = T2.CustomerId
                ORDER BY t1.[time]
                FOR XML PATH('')
                ), 1, 1, '') AS Interaction
        ,STUFF((
                SELECT ',' + cast(t1.[Time] AS VARCHAR(255))
                FROM my_table T1
                WHERE T1.CustomerId = T2.CustomerId
                ORDER BY t1.[time]
                FOR XML PATH('')
                ), 1, 1, '') AS [Time]
    FROM my_table T2
    ) q1;

结果:

+------------------------------------------------------------------------------------------+
|                        CustomerId, Interaction Path, Date Path                           |
+------------------------------------------------------------------------------------------+
| 1, Mail > Email > Facebook > Facebook, 2015-01-01 > 2015-01-03 > 2015-01-05 > 2015-01-09 |
| 3, Mail, 2015-01-12                                                                      |
| 4, Mail, 2015-01-17                                                                      |
+------------------------------------------------------------------------------------------+

SQL Fiddle Demo

注意:如果您需要与您的日期格式相同的日期,您只需将Time 字段转换为日期样式101

【讨论】:

  • 这个解决方案也很完美。感谢您抽出宝贵时间。
【解决方案2】:

MySQL 解决方案:

使用函数 GROUP_CONCAT(expr)。 文档可以在这里找到:https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

解决方案

select CustomerID, GROUP_CONCAT(interaction ORDER BY time SEPARATOR '>') as 'Interaction Path', GROUP_CONCAT(time ORDER BY time SEPARATOR '>') as 'Date Path' from my_table group by CustomerID;

结果

+------------+------------------------------+---------------------------------------------+
| CustomerID | Interaction Path             | Date Path                                   |
+------------+------------------------------+---------------------------------------------+
|          1 | Mail>Email>Facebook>Facebook | 2015-01-01>2015-01-03>2015-01-05>2015-01-09 |
|          3 | Mail                         | 2015-01-12                                  |
|          4 | Mail                         | 2015-01-17                                  |
+------------+------------------------------+---------------------------------------------+

【讨论】:

  • 那应该是一个评论。
  • 他可以通过扩展答案以包含 SQL 查询来使其不再是评论。
  • 这非常有效。谢谢你。感谢您没有像我经常看到的那样撕毁我的帖子。我正在学习..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多