我当前的查询返回以下结果
我需要的是我必须在列标题中显示日期。我知道必须使用 Pivot
来完成示例:如果我们想在列标题中显示月份,那么查询将类似于..
SELECT [January], [February], [March]
FROM ( SELECT [Month], SaleAmount
FROM Sales
) p PIVOT ( SUM(SaleAmount)
FOR [Month]
IN ([January],[February],[March])
) AS pvt
我认为我的结果查询应该看起来像Pivot ( (Price) FOR [DateVal] IN (What will be here?) )
这里是结果列应该是什么样的
注意:在结果集中,它当前显示12月份的月份数据,但可以是任何月份。
感谢您的帮助......
答案 0 :(得分:3)
更新4 好的,既然您发布了所有查询,并且发表了评论,那么您应该尝试这样做:
DECLARE @FirstDay SMALLDATETIME
SELECT @FirstDay = CONVERT(SMALLDATETIME, (@year + '-' + @month + '-01'));
WITH Dates AS
(
SELECT @FirstDay AS DateVal
UNION ALL
SELECT DATEADD(d, 1, DateVal) AS DateVal
FROM Dates
WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @FirstDay)
)
SELECT * INTO #Dates FROM Dates
DECLARE @hotelID INT, @packageID INT, @year VARCHAR(4), @Dates VARCHAR(1000), @month VARCHAR(2), @Query VARCHAR(MAX)
SELECT @hotelID=248, @packageID=76, @year='2010', @month='12',@Dates=''
SELECT co.*,wb.Name,rc.HotelName
INTO #HotelData
FROM RCompetitorOccupancy co
INNER JOIN websites wb ON wb.websiteid=co.websiteid
INNER JOIN RoomCompetitor rc ON rc.competitorid=co.competitorid
WHERE YEAR(occDate)=@year AND MONTH(occdate)=@month AND packageid=@packageID
AND roomTypeid IN (SELECT roomtypeid FROM CompetitorRoomType WHERE DESCRIPTION=119)
SELECT @Dates = @Dates + '[' + CAST(DATEPART(DAY,DateVal) AS VARCHAR(2)) + '-' + LEFT(DATENAME(MONTH,DateVal),3)+ '],'
FROM #Dates
GROUP BY Dateval
SET @Dates = LEFT(@Dates,LEN(@Dates)-1)
SET @Query = '
SELECT roomtypeid, description, [Name], [HotelName], '+@Dates+'
FROM ( SELECT HD.roomtypeid, HD.description, HD.[Name], HD.[HotelName], HD.Price,
CAST(DATEPART(DAY,DateVal) AS VARCHAR(2)) + ''-'' + LEFT(DATENAME(MONTH,DateVal),3) [Date]
FROM #Dates D
LEFT JOIN #HotelData HD
ON D.DateVal = HD.OccDate) T
PIVOT ( SUM(Price) FOR [Date] IN ('+@Dates+') ) AS PT'
EXEC(@Query)