您可以使用類似:
SELECT fp.Name,
[Jan 2012] = SUM(CASE WHEN fp.Date >= '20120101' AND fp.Date < '20120201' THEN 1 ELSE 0 END),
[Feb 2012] = SUM(CASE WHEN fp.Date >= '20120201' AND fp.Date < '20120301' THEN 1 ELSE 0 END),
[Mar 2012] = SUM(CASE WHEN fp.Date >= '20120301' AND fp.Date < '20120401' THEN 1 ELSE 0 END),
[Apr 2012] = SUM(CASE WHEN fp.Date >= '20120401' AND fp.Date < '20120501' THEN 1 ELSE 0 END),
[May 2012] = SUM(CASE WHEN fp.Date >= '20120501' AND fp.Date < '20120601' THEN 1 ELSE 0 END),
[Jun 2012] = SUM(CASE WHEN fp.Date >= '20120601' AND fp.Date < '20120701' THEN 1 ELSE 0 END),
[Jul 2012] = SUM(CASE WHEN fp.Date >= '20120701' AND fp.Date < '20120801' THEN 1 ELSE 0 END),
[Aug 2012] = SUM(CASE WHEN fp.Date >= '20120801' AND fp.Date < '20120901' THEN 1 ELSE 0 END),
[Sep 2012] = SUM(CASE WHEN fp.Date >= '20120901' AND fp.Date < '20121001' THEN 1 ELSE 0 END),
[Oct 2012] = SUM(CASE WHEN fp.Date >= '20121001' AND fp.Date < '20121101' THEN 1 ELSE 0 END),
[Nov 2012] = SUM(CASE WHEN fp.Date >= '20121101' AND fp.Date < '20121201' THEN 1 ELSE 0 END),
[Dec 2012] = SUM(CASE WHEN fp.Date >= '20121201' AND fp.Date < '20130101' THEN 1 ELSE 0 END),
[Jan 2013] = SUM(CASE WHEN fp.Date >= '20130101' AND fp.Date < '20130201' THEN 1 ELSE 0 END),
[Feb 2013] = SUM(CASE WHEN fp.Date >= '20130201' AND fp.Date < '20130301' THEN 1 ELSE 0 END),
[Mar 2013] = SUM(CASE WHEN fp.Date >= '20130301' AND fp.Date < '20130401' THEN 1 ELSE 0 END),
[Apr 2013] = SUM(CASE WHEN fp.Date >= '20130401' AND fp.Date < '20130501' THEN 1 ELSE 0 END),
[May 2013] = SUM(CASE WHEN fp.Date >= '20130501' AND fp.Date < '20130601' THEN 1 ELSE 0 END),
[Jun 2013] = SUM(CASE WHEN fp.Date >= '20130601' AND fp.Date < '20130701' THEN 1 ELSE 0 END),
[Jul 2013] = SUM(CASE WHEN fp.Date >= '20130701' AND fp.Date < '20130801' THEN 1 ELSE 0 END),
[Aug 2013] = SUM(CASE WHEN fp.Date >= '20130801' AND fp.Date < '20130901' THEN 1 ELSE 0 END),
[Sep 2013] = SUM(CASE WHEN fp.Date >= '20130901' AND fp.Date < '20131001' THEN 1 ELSE 0 END),
[Oct 2013] = SUM(CASE WHEN fp.Date >= '20131001' AND fp.Date < '20131101' THEN 1 ELSE 0 END),
[Nov 2013] = SUM(CASE WHEN fp.Date >= '20131101' AND fp.Date < '20131201' THEN 1 ELSE 0 END),
[Dec 2013] = SUM(CASE WHEN fp.Date >= '20131201' AND fp.Date < '20140101' THEN 1 ELSE 0 END)
FROM f_page_views fp
WHERE fp.date > '2012-01-01 00:00:00.000'
AND fp.date < '2013-12-31 00:00:00.000'
GROUP BY fp.Name;
注意,而不是使用WHEN MONTH(fp.Date) = 1 AND YEAR(fp.Date) = 2012
我已經使用WHEN fp.Date >= '20120101' AND fp.Date < '20120201'
,雖然這意味着後者將有更好的表現同樣的事情,特別是如果你有指標fp.Date
另一種方法是使用PIVOT功能:
WITH Data AS
( SELECT fp.Name,
ViewMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, fp.Date), 0),
Value = 1
FROM f_Page_Views
WHERE fp.date > '2012-01-01 00:00:00.000'
AND fp.date < '2013-12-31 00:00:00.000'
)
SELECT *
FROM Data
PIVOT
( SUM(Value)
FOR ViewMonth IN
( [20120101], [20120201], [20120301], [20120401], [20120501], [20120601],
[20120701], [20120801], [20120901], [20121001], [20121101], [20121201],
[20130101], [20130201], [20130301], [20130401], [20130501], [20130601],
[20130701], [20130801], [20130901], [20131001], [20131101], [20131201]
) pvt
如果您需要根據所提供的,那麼你可以使用動態SQL與上述任一種方法的日期範圍動態創建的列:
DECLARE @SQL NVARCHAR(MAX) = '';
DECLARE @StartDate DATETIME = '20120101',
@EndDate DATETIME = '20131231';
SELECT @SQL = @SQL + ',' + QUOTENAME(LEFT(DATENAME(MONTH, StartDate), 3) + ' ' + DATENAME(YEAR, StartDate)) + ' = SUM(CASE WHEN fp.Date >= ''' + CONVERT(VARCHAR, StartDate, 112) + ''' AND fp.Date < ''' + CONVERT(VARCHAR, EndDate, 112) + ''' THEN 1 ELSE 0 END)'
FROM ( SELECT [StartDate] = DATEADD(MONTH, Number, @StartDate),
[EndDate] = DATEADD(MONTH, 1 + Number, @StartDate)
FROM Master..spt_values
WHERE Number BETWEEN 0 AND DATEDIFF(MONTH, @StartDate, @Enddate)
AND Type = 'P'
) d
SET @SQL = 'SELECT fp.Name' + @SQL + ' FROM f_page_views fp WHERE fp.date > @Start AND fp.Date < @End GROUP BY fp.Name';
EXECUTE SP_EXECUTESQL @SQL, N'@Start DATETIME, @End DATETIME', @StartDate, @EndDate;
OR
DECLARE @SQL NVARCHAR(MAX) = '';
DECLARE @StartDate DATETIME = '20120101',
@EndDate DATETIME = '20131231';
SELECT @SQL = @SQL + ',' + QUOTENAME(CONVERT(VARCHAR, DATEADD(MONTH, Number, @StartDate), 112))
FROM Master..spt_values
WHERE Number BETWEEN 0 AND DATEDIFF(MONTH, @StartDate, @Enddate)
AND Type = 'P';
SET @SQL = 'WITH Data AS
( SELECT fp.Name,
ViewMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, fp.Date), 0),
Value = 1
FROM f_Page_Views fp
WHERE fp.date > @Start
AND fp.date < @End
)
SELECT *
FROM Data
PIVOT
( SUM(Value)
FOR ViewMonth IN (' + STUFF(@SQL, 1, 1, '') + ')
) pvt';
EXECUTE SP_EXECUTESQL @SQL, N'@Start DATETIME, @End DATETIME', @StartDate, @EndDate;
你們是不是要字段添加到每年的查詢都喜歡'[2012年1月] ,,, [2013年1月],... [2013年12月]'?所以如果你用'2012-01-01'和'2015-12-31'過濾你應該有48個字段? – Kaf 2013-03-11 11:32:34
是的,那是我想要做的:| – Bushell 2013-03-11 11:35:26
當結果集中的字段數不同時,不確定前端(如果有)如何處理它。爲了得到這樣的結果,你可能需要使用'PIVOT',[這裏是一個類似的問題](http://stackoverflow.com/questions/7145694/pivot-with-month)。 – Kaf 2013-03-11 11:38:49