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;
eklemek Ve size bırakacağım aynı anda birçok ile yapmak istediği durumda bir tablo sürümü:
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;
Orijinal sorgumdan bazı şeyleri basitleştirdim.
Vay, bazı vahiy! Tabii ki, sistem tablosunu kullanarak kendi yaratma ve doldurma gereğini ortadan kaldırır. Ama benim için en önemli şey gün saymayı seçtiğiniz yol. Korku veren! Ben başkalarının gönderdiği gibi bir sürümü ile geldim, ama şimdi göstermek için utanıyorum: çok önemsiz! –
@Andriy - cevabını bastıysanız hoş olurdu :) – RichardTheKiwi
@cyberwiki: Çok doğru, üzgünüm. Düşündüm de. Bana kendi niyetimi hatırlatmak için çok güzel. :) –