我是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
我还希望显示唯一的名称......
请帮助我或告诉我如何找到解决方案。
感谢任何形式的帮助。