加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-05-16 17:07:14 所属栏目:MsSql教程 来源:网络整理
导读:我有一张像这样的预订表: booking_id,date,client,sponsor 我正在尝试获得每月摘要: SELECT MONTH(date) AS M,Sponsor,Client,COUNT(booking_id) AS cFROM bookingGROUP BY M,Client 现在我想知道客户在哪些日期预订.我尝试使用STUFF()(在这篇文章中引用

我有一张像这样的预订表:

booking_id,date,client,sponsor

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

SELECT 
  MONTH(date) AS M,Sponsor,Client,COUNT(booking_id) AS c
FROM booking
GROUP BY
 M,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

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

答案的大赞誉:-)

解决方法

SELECT [Month] = DATENAME(MONTH,M),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('')),2,'')
FROM 
(
  SELECT 
      M = DATEADD(MONTH,DATEDIFF(MONTH,'19000101',[date]),'19000101'),COUNT(booking_id) AS c
    FROM dbo.booking
    GROUP BY DATEADD(MONTH,Client
) AS x
ORDER BY M,Client;

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

编辑这是我测试的方式:

DECLARE @booking TABLE
( 
  booking_id INT IDENTITY(1,1) PRIMARY KEY,[date] DATE,Sponsor VARCHAR(32),Client VARCHAR(32)
);

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

SELECT [Month] = DATENAME(MONTH,[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,COUNT(booking_id) AS c
    FROM @booking
    GROUP BY DATEADD(MONTH,Client;

结果:

Month   Sponsor Client  c       dates
------- ------- ------- ------- --------------
March   AB      y       3       12,18
March   FE      x       4       16,21
April   AB      x       2       4,8

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读