Solved

SQL 2005 - Pivot changing money value to datetime

Posted on 2009-03-31
9
446 Views
Last Modified: 2012-05-06
Hello Experts,

Not sure if you can help with this limited code but I'll give it a try.

I'm creating some dynamic sql and using a pivot funciton with the code below.

The resulting table looks fine except when I select the MAX(DayRate) in my pivot, it is bringing back a datetime of 1900-08-06 00:00:00:)

Can anyone suggest why this would happen?

Many thanks
Don
SET DATEFORMAT DMY

	DECLARE @ArrivalDate datetime

	DECLARE @displaydate nvarchar(22)

	DECLARE @strSQL nvarchar(max)

	DECLARE @strSQL2 nvarchar(max)

	DECLARE @cols nvarchar(max), @cols2 nvarchar(max), @i int

	DECLARE @colname sysname
 

--	Declare a local temporary table to be pivoted with the dates

	DECLARE @tblDate table (AutoNumber int identity not null primary key, DisplayDate nvarchar(22))
 

--	Declare a global temporary table to grab the room details

	CREATE TABLE #Ratestbl (RoomID int, 

							RoomType nvarchar(50),

							RoomDescription nvarchar(max),

							MaxAdults int,

							MinStay int,

							RackRate money,

							)

	

	SET @ArrivalDate = CAST(@Arrival AS DateTime)
 

--	Insert the arrival date and the 27 days that follow into the table to be pivoted	

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+1, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+2, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+3, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+4, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+5, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+6, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+7, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+8, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+9, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+10, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+11, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+12, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+13, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+14, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+15, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+16, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+17, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+18, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+19, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+20, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+21, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+22, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+23, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+24, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+25, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+26, 103))

	insert into @tblDate values(convert(nvarchar(22), @arrivaldate+27, 103))
 

--	Construct the column list for the IN clause

--	e.g., [29/12/2008],[30/12/2008],[31/12/2008]

	SET @i = 1

	SET @cols = N''

	SET @cols2 = N''

	WHILE @i < 29

	BEGIN

	  SET @cols = @cols + N',['+ (select DisplayDate from @tblDate where AutoNumber = @i) + N']'

	  SET @cols2 = @cols2 + N','''+ (select DisplayDate from @tblDate where AutoNumber = @i) + N''''

	  set @colname = (select DisplayDate from @tblDate where AutoNumber = @i)

	  set @strSQL = 'alter table #Ratestbl add [' + cast(@colname as nvarchar(22)) + '] datetime'

	  exec (@strSQL)

	  SET @i = @i + 1

	END

	SET @cols = SUBSTRING(@cols, 2, LEN(@cols))

	SET @cols2 = SUBSTRING(@cols2, 2, LEN(@cols2))
 

--	Pivot query to build result set (in sql 2005 have to use dynamic sql to make column headings dynamic

	set @strSQL ='	select *

					from (select a.RoomID as RoomID,

								a.RoomType as RoomType,

								cast(a.RoomDescription as nvarchar(max)) as RoomDescription,

								a.RoomMaxAdults as MaxAdults,

								a.MinStay as MinStay,

								a.rate as RackRate,

								convert(nvarchar(22), b.RateDate, 103) as Ratedate,

								b.dayrate as DayRate

						 from dbo.Room a

							left outer join dbo.rates b

								on	a.roomid = b.roomid 

									and b.Inventory > 0

						where  a.RoomId = ' + cast(@RoomId as nvarchar(128)) + '

								and convert(nvarchar(22), b.RateDate, 103) in (' + @cols2 + ')

						 ) as a pivot (max(DayRate) for RateDate in ('+ @cols + ') ) as piv'

						 

	INSERT INTO #Ratestbl

	EXEC (@strSQL)

Open in new window

0
Comment
Question by:WorldBlueAustralia
  • 3
  • 3
  • 2
  • +1
9 Comments
 
LVL 75

Expert Comment

by:Anthony Perkins
Comment Utility
Because DayRate = 218 Which translates to 1900-08-06.
0
 
LVL 21

Expert Comment

by:pinaldave
Comment Utility

use

max(DayRate) AS Money
0
 
LVL 26

Expert Comment

by:Chris Luttrell
Comment Utility
I think you have mixed up a variable name, RateDate for DateRate.  You have
(max(DayRate) for RateDate
in your pivot and RateDate I bet is a Date field and Pivot is using that for the resuts data type.
0
 
LVL 26

Expert Comment

by:Chris Luttrell
Comment Utility
I mean RateDate for DayRate
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

Author Comment

by:WorldBlueAustralia
Comment Utility
Thanks Guys,

You've identified the problem, now I need the correct syntax to solve it.

max(DayRate) AS Money

Did not work.


RateDate is a Date
DayRate is a Rate (money)

Thanks
0
 
LVL 75

Expert Comment

by:Anthony Perkins
Comment Utility
How about:
max(DayRate) AS MaxDayRate
0
 
LVL 26

Accepted Solution

by:
Chris Luttrell earned 500 total points
Comment Utility
WorldBlueAustralia,
Sorry for the delay, your reply caught me on my commute home from work.  I set up a test to see what was going on and found that you have created the columns in your temp table as DATETIME instead of MONEY
        set @strSQL = 'alter table Ratestbl add [' + cast(@colname as nvarchar(22)) + '] datetime'
I changed datetime to MONEY on this line and it works like a charm
        set @strSQL = 'alter table Ratestbl add [' + cast(@colname as nvarchar(22)) + '] MONEY'
0
 

Author Comment

by:WorldBlueAustralia
Comment Utility
I was hoping someone clever would see it.

I struggled for hours...

Many thanks Luttrell!
Don
0
 

Author Closing Comment

by:WorldBlueAustralia
Comment Utility
Thanks Luttrell!
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

In this article I will describe the Copy Database Wizard method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
Via a live example, show how to backup a database, simulate a failure backup the tail of the database transaction log and perform the restore.
Via a live example, show how to shrink a transaction log file down to a reasonable size.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now