sql-server - 模仿 group_concat() 与 GROUP BY 结合

标签 sql-server sql-server-2008 t-sql group-by

我有一个像这样的“预订”餐 table :

booking_id,
date,
client,
sponsor

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

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 语句冲突。

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

M       Sponsor     Client  c     
March   AB          y       3
March   FE          x       4
April   AB          x       2

期望的输出:

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) 来获取最后一列。

非常感谢您的回答:-)

最佳答案

SELECT [Month] = DATENAME(MONTH, M), Sponsor, Client, c,
  [dates] = STUFF((SELECT N', ' + 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(''),
    TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 2, N'')
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;

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

编辑这是我的测试方法:

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(''),
    TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 2, N'')
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;

结果:

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

关于sql-server - 模仿 group_concat() 与 GROUP BY 结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10298805/

相关文章:

sql - TSQL Where 子句满足多个条件

sql - 按使用 case 表达式内的别名的计算列进行排序

sql - 基于 TSQL/Microsoft SQL Server 中的另一个字段对字段值进行透视

sql-server - Sql Server 2008 R2 DC 插入性能更改

SQL 更新 : Multiple columns in one statement or multiple single-column statements?

c# - 调用SQL Server存储过程的问题

sql-server - 事务内的 T-SQL EXEC 命令

mysql - 删除数据库中的行是否会使该数据库释放空间?

sql - 如何将管道分隔的文本文件数据导入 SQL Server 表

sql-server - 可以使用 "SQL Server Authentication"登录另一个 Windows 帐户吗?