gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:49:07 25 4
gpt4 key购买 nike

我有一张像这样“预订”的 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 ', ' + 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;

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

编辑 这是我测试的方法:
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;

结果:
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com