sql-server – 模仿group_concat()与GROUP BY结合使用
发布时间:2021-05-16 14:18:05 所属栏目: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 (编辑:新余站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读

