DECLARE
@StartDate datetime,
@EndDate datetime;
SET @StartDate = '20101115';
SET @EndDate = '20101205';
WITH Mos AS (
SELECT
Number,
DateAdd(Month, Number, @StartDate - Day(@StartDate) + 1) MoDate
FROM master.dbo.spt_values
WHERE
Type = 'P'
AND Number <= DateDiff(Month, @StartDate, @EndDate)
), Dys AS (
SELECT
MoDate,
DateDiff(
Day,
CASE WHEN Number = 0 THEN @StartDate ELSE MoDate END,
CASE WHEN Number = DateDiff(Month, @StartDate, @EndDate) THEN @EndDate ELSE DateAdd(Month, 1, MoDate) - 1 END
) + 1 Cnt
FROM Mos
)
SELECT
Year(MoDate) Yr,
Coalesce(DateName(Month, MoDate), 'Total') Mo,
Convert(varchar(11), Sum(Cnt)) + ' day' + CASE WHEN Sum(Cnt) = 1 THEN '' ELSE 's' END Descr
FROM Dys
GROUP BY MoDate
WITH ROLLUP
ORDER BY Grouping(MoDate), MoDate;
を追加するためにあなたにそれを残しておきますそして、ここであなたが一度に多くでそれをやってみたかった場合のテーブルのバージョンがあります:
CREATE TABLE AccountDates (
AccountCode varchar(10) NOT NULL CONSTRAINT PK_AccountDates PRIMARY KEY CLUSTERED,
StartDate datetime,
EndDate datetime
);
INSERT AccountDates VALUES ('BLINKEN', '20101115', '20101205');
INSERT AccountDates VALUES ('KRAM', '20101027', '20110118');
INSERT AccountDates VALUES ('NUVU', '20101207', '20101207');
WITH Mos AS (
SELECT
AccountCode,
D.StartDate,
D.EndDate,
Number,
DateAdd(Month, Number, D.StartDate - Day(D.StartDate) + 1) MoDate
FROM
AccountDates D
INNER JOIN master.dbo.spt_values V ON V.Number <= DateDiff(Month, D.StartDate, D.EndDate)
WHERE
V.Type = 'P'
), Dys AS (
SELECT
AccountCode,
MoDate,
DateDiff(
Day,
CASE WHEN Number = 0 THEN StartDate ELSE MoDate END,
CASE WHEN Number = DateDiff(Month, StartDate, EndDate) THEN EndDate ELSE DateAdd(Month, 1, MoDate) - 1 END
) + 1 Cnt
FROM Mos
)
SELECT
AccountCode,
Year(MoDate) Yr,
Coalesce(DateName(Month, MoDate), 'Total') Mo,
Convert(varchar(11), Sum(Cnt)) + ' day' + CASE WHEN Sum(Cnt) = 1 THEN '' ELSE 's' END Descr
FROM Dys
GROUP BY AccountCode, MoDate
WITH ROLLUP
HAVING Grouping(AccountCode) = 0
ORDER BY
AccountCode,
Grouping(MoDate),
MoDate;
私は元のクエリから少し単純化しました。
うわー、いくつかの啓示!もちろん、システムテーブルを使用することで、独自のものを作成して設定する必要がなくなります。しかし、ここで私の主なものは、あなたが日数を数えるために選んだ方法です。驚くばかり!私は他の人が投稿したものに似たバージョンを思いついたが、今私はそれを示すのは恥ずかしい。 –
@Andriy - 答えをアップアップした方がいいと思うよ。 – RichardTheKiwi
@cyberwiki:本当に、申し訳ありません。私はそれをupvotedと思った。自分の意図について私に思い出させるのはとても素敵です。 :) –