你必须使用动态SQL和PIVOT
,以实现自己的目标
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)
SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME('week ' + CONVERT(NVARCHAR(2), DATEPART(isowk, adate))
+ ' - ' + CONVERT(NVARCHAR(4), YEAR(adate)))
FROM Table1
ORDER BY 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @sql = 'SELECT type, ' + @cols +
' FROM
(
SELECT type,
''week '' + CONVERT(NVARCHAR(2), DATEPART(isowk, adate))
+ '' - ''
+ CONVERT(NVARCHAR(4), YEAR(adate)) week,
COUNT(*) type_count
FROM table1
WHERE adate BETWEEN ''20130101'' AND ''20131231''
GROUP BY type, YEAR(adate), DATEPART(isowk, adate)
) x
PIVOT
(
MAX(type_count) FOR week IN (' + @cols + ')
) p
ORDER BY type'
EXECUTE(@sql)
示例输出:
| TYPE | WEEK 1 - 2013 | WEEK 2 - 2013 |
----------------------------------------
| A | 4 | 1 |
| B | 2 | 2 |
这里是SQLFiddle演示
此[问题](http://stackoverflow.com/questions/6410134/how-to-select-sql-results-group逐周)接近你所需要的。 – Fung
谢谢 - 可以在一年内自动创建第1周到第52周,而不是手动创建52周? – user2103670