2011-04-13 71 views
3

我试图在一个SQL查询,我们有上月搜索明智为一个月SQL查询明智

例如我的表像

Username visited Visisted_Dated 

    A   1  01/11/2010 
    B   1  10/11/2010 
    A   1  03/12/2010 
    B   1  06/12/2010 
    B   1  06/12/2010 
    A   1  03/02/2011 
    B   1  05/02/2011 
    A   1  11/03/2011 
    A   1  20/03/2011 
    B   1  01/03/2011 

现在,如果我要搜索的用户提供无访问之间2月至4月我需要得到输出为

Users Nov_2010 Dec_2010 Jan_2011 Feb_2011 March_2011 
    A  1   1  0   1   2    
    B  1   2  0   1   1   

请让我知道继续下去的方式。

感谢

+0

解决方案,我认为你要更多的列你会得到更多的月份? – gbn 2011-04-13 05:00:29

回答

2

恐怕你必须使用动态SQL:

DECLARE @Sql VARCHAR(8000) 
DECLARE @ColumnNames VARCHAR(1000) 
DECLARE @BeginDate DATETIME 
DECLARE @EndDate DATETIME 

SET @BeginDate = '2010-11-1' 
SET @EndDate = '2011-4-1' 
SET @ColumnNames = '' 

WHILE @BeginDate <= @EndDate 
BEGIN 
    SET @ColumnNames = @ColumnNames + ',[' + DateName(month,@BeginDate) + '_' + Cast(Year(@BeginDate) AS VARCHAR(4)) + ']' 
    SET @BeginDate = DateAdd(Month, 1, @BeginDate) 
END 
IF Len(@ColumnNames) > 0 
    SET @ColumnNames = Right(@ColumnNames, Len(@ColumnNames) - 1) 

PRINT @ColumnNames 

SET @Sql = ' 
WITH U AS 
(
    SELECT UserName, DateName(month,Visited_Dated) + ''_'' + Cast(Year(Visited_Dated) AS VARCHAR(4)) AS VisitedMonth, Visited 
    FROM Users 
) 
SELECT * 
FROM U 
PIVOT (
    SUM(Visited) FOR VisitedMonth IN (' + @ColumnNames + ') 
) AS P' 

EXEC (@Sql) 
0

有it'sa基于PIVOT

SELECT UserName,[201011], [201012], [201101], [201102], [201103] 
FROM 
(SELECT UserName,Visited,convert(varchar(6),[Visited_Dated],112) Periodo 
FROM [Table]) AS st 
PIVOT 
(
COUNT(Visited) 
FOR Periodo IN ([201011], [201012], [201101], [201102], [201103]) 
) AS pt;