2

私はこのようなテーブル「予約」を持っています:

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()を使用してみました(この投稿で参照:Microsoft SQL Server2005でのgroup_concatMySQL関数のシミュレーション?)が、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)を使用して最後の列を取得します。

答えに対する大きな称賛:-)

4

1 に答える 1

3
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;

スポンサー/クライアントの組み合わせで同じ日に2つの予約がある場合、その日の番号がリストに2回表示されることに注意してください。

編集これが私がテストした方法です:

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
于 2012-04-24T14:15:24.090 に答える