首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mimic group_concat()与GROUP BY组合

Mimic group_concat()与GROUP BY组合
EN

Stack Overflow用户
提问于 2012-04-24 21:25:11
回答 1查看 813关注 0票数 2

我有一个像这样的桌子‘预订’:

代码语言:javascript
复制
booking_id,
date,
client,
sponsor

我正在尝试获取月度摘要:

代码语言:javascript
复制
SELECT 
  MONTH(date) AS M,
  Sponsor,
  Client,
  COUNT(booking_id) AS c
FROM booking
GROUP BY
 M, Sponsor, Client

现在,我想看看客户预订的日期。我尝试使用STUFF() (在本文中引用:Simulating group_concat MySQL function in Microsoft SQL Server 2005?),但它与group-by语句冲突。

根据请求提供样本数据。目前我有以下内容:

代码语言:javascript
复制
M       Sponsor     Client  c     
March   AB          y       3
March   FE          x       4
April   AB          x       2

所需输出:

代码语言:javascript
复制
M       Sponsor     Client  c   dates
March   AB          y       3   12, 15, 18
March   FE          x       4   16, 19, 20, 21
April   AB          x       2   4, 8

其中数字是天数(例如,3月12日、3月15日、3月18日)。在mysql中,我会使用group_concat(date)来获取最后一列。

答案令人赞叹:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-24 22:15:24

代码语言:javascript
复制
SELECT [Month] = DATENAME(MONTH, M), Sponsor, Client, c,
  [dates] = STUFF((SELECT ', ' + RTRIM(DATEPART(DAY, [date])) 
    FROM dbo.booking AS b
    WHERE b.Sponsor = x.Sponsor
      AND b.Client = x.Client
      AND b.[date] >= x.M AND b.[date] < DATEADD(MONTH, 1, x.M) 
    ORDER BY [date]
    FOR XML PATH('')), 1, 2, '')
FROM 
(
  SELECT 
      M = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', [date]), '19000101'),
      Sponsor,
      Client,
      COUNT(booking_id) AS c
    FROM dbo.booking
    GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, '19000101', [date]), '19000101'),
      Sponsor,
      Client
) AS x
ORDER BY M, Sponsor, Client;

请注意,如果赞助商/客户的组合在同一天有两个预订,则日期编号将在列表中出现两次。

编辑下面是我测试的方法:

代码语言:javascript
复制
DECLARE @booking TABLE
( 
  booking_id INT IDENTITY(1,1) PRIMARY KEY,
  [date] DATE,
  Sponsor VARCHAR(32),
  Client VARCHAR(32)
);

INSERT @booking([date], Sponsor, Client) VALUES
('20120312','AB','y'), ('20120315','AB','y'), ('20120318','AB','y'),
('20120316','FE','x'), ('20120319','FE','x'), ('20120321','FE','x'), ('20120320','FE','x'),
('20120404','AB','x'), ('20120408','AB','x');

SELECT [Month] = DATENAME(MONTH, M), Sponsor, Client, c,
  [dates] = STUFF((SELECT ', ' + RTRIM(DATEPART(DAY, [date])) 
    FROM @booking AS b
    WHERE b.Sponsor = x.Sponsor
      AND b.Client = x.Client
      AND b.[date] >= x.M AND b.[date] < DATEADD(MONTH, 1, x.M) 
    ORDER BY [date]
    FOR XML PATH('')), 1, 2, '')
FROM 
(
  SELECT 
      M = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', [date]), '19000101'),
      Sponsor,
      Client,
      COUNT(booking_id) AS c
    FROM @booking
    GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, '19000101', [date]), '19000101'), 
      Sponsor, 
      Client
) AS x
ORDER BY M, Sponsor, Client;

结果:

代码语言:javascript
复制
Month   Sponsor Client  c       dates
------- ------- ------- ------- --------------
March   AB      y       3       12, 15, 18
March   FE      x       4       16, 19, 20, 21
April   AB      x       2       4, 8
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10298805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档