我是 SQL Server 的新手,我面临使用数据透视表显示数据的问题。
我的表结构是这样的:
UserName VisitedDate Amount Visted
bbb 2012-07-05 200 1
bbb 2012-06-03 300 3
ccc 2012-04-15 500 5
ccc 2012-06-30 600 3
我搜索了很多,发现了一些有用的东西:
DECLARE @Sql VARCHAR(8000)
DECLARE @ColumnNames VARCHAR(1000)
DECLARE @BeginDate DATETIME
DECLARE @EndDate DATETIME
declare @AAmount varchar(1000)
SET @BeginDate = '2012-4-1'
SET @EndDate = '2013-3-30'
SET @ColumnNames = ''
set @AAmount = ''
WHILE @BeginDate <= @EndDate
BEGIN
SET @ColumnNames = @ColumnNames + ',[' + DateName(month,@BeginDate) + '_' + Cast(Year(@BeginDate) AS VARCHAR(4)) + ']'
SET @AAmount = @AAmount + ',[' +'Amount'+ 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
IF Len(@AAmount) > 0
SET @AAmount = Right(@AAmount, Len(@AAmount) - 1)
PRINT @AAmount
SET @Sql = '
WITH U AS
(
SELECT UserName, DateName(month,Visited_Date) + ''_'' + Cast(Year(Visited_Date) AS VARCHAR(4)) AS VisitedMonth,Amount,DateName(month,Visited_Date) + ''_'' + Cast(Year(Visited_Date) AS VARCHAR(4)) AS VisitedMonth1,Visited
FROM Users
)
SELECT *
FROM U
PIVOT (
SUM(Amount) FOR VisitedMonth IN (' + @ColumnNames + ')
) AS P1
PIVOT (
SUM(Visited) FOR VisitedMonth1 IN (' + @AAmount + ')
) AS pivotable'
EXEC (@Sql)
这个查询的结果是这样的:
UserName AprilAmount_2012 MayAmt_2012 JuneAmt_2012 April_2012 May_2012 June_2012
bbb NULL NULL NULL NULL NULL NULL
bbb NULL NULL 300 NULL NULL NULL
ccc NULL NULL 600 NULL NULL NULL
ccc 500 NULL NULL NULL NULL NULL
请注意,上午。在标题是金额
现在我的问题是:
对于表中的 3 列,它显示了数据,但我尝试再添加一列访问过,然后它没有显示预期的结果....
我还想将列重新排列为:
UserName AprilAmount_2012 April_2012 MayAmt_2012 May_2012 JuneAmt_2012 June_2012 bbb NULL NULL NULL NULL NULL NULL bbb NULL NULL NULL NULL 300 3 ccc NULL 4 NULL NULL 600 NULL ccc 500 NULL NULL NULL NULL 5
我还希望显示唯一的名称...
请帮助我或告诉我方法,以便我找到解决方案。
任何形式的帮助表示赞赏。