简体   繁体   中英

Sql Pivoting on date

I am getting this error when trying to convert the below logic in to SQL query

Logic:

TRANSFORM First([SirName] & "  - " & [SecondName]) AS Name
SELECT qry_Date.RoomNumber
FROM Guest RIGHT JOIN qry_Date ON Guest.ID = qry_Date.GuestID
WHERE (((qry_Date.RoomNumber) Is Not Null))
GROUP BY qry_Date.RoomNumber
PIVOT qry_Date.Date;

Below is what i have done so far

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS VARCHAR(MAX)

SELECT @cols = STUFF((SELECT distinct top 100 percent
                        ',' + QUOTENAME(convert(NVARCHAR(MAX),qry_Date.Date,103))
                FROM qry_Date
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'');

SET @query =  'SELECT Name, ' + @cols + '
FROM 
    (SELECT [SirName] +  '' - '' +  [SecondName] AS Name
    ,qry_Date.RoomNumber
    ,qry_Date.Date
FROM Guest RIGHT JOIN qry_DateTemp ON Guest.ID = qry_Date.GuestID
WHERE qry_Date.RoomNumber Is Not Null) as t 
PIVOT
(count(Name) FOR [Date] IN( ' + @cols + ') 
 ) as p'

print @query   
execute(@query)

Which results error

Msg 8114, Level 16, State 1, Line 9 Error converting data type nvarchar to datetime2. Msg 473, Level 16, State 1, Line 9 The incorrect value "13/12/2014" is supplied in the PIVOT operator. Msg 207, Level 16, State 1, Line 1 Invalid column name 'Name'.

My print @query output

SELECT Name, [01/12/2014],[02/12/2014],[03/12/2014],[04/12/2014],[05/12/2014],[06/12/2014],[07/12/2014],[08/12/2014],[09/12/2014],[10/12/2014],[11/12/2014],[12/12/2014],[13/12/2014],[14/12/2014],[15/12/2014],[16/12/2014],[17/12/2014],[18/12/2014],[19/12/2014],[20/12/2014],[21/12/2014],[22/12/2014],[23/12/2014],[24/12/2014],[25/12/2014],[26/12/2014],[27/12/2014],[28/12/2014],[29/12/2014],[30/12/2014],[31/12/2014]
FROM 
    (SELECT [SirName] +  '' - '' +  [SecondName]  AS Name
    ,qry_Date.RoomNumber
    ,qry_Date.Date
FROM Guest RIGHT JOIN qry_Date ON Guest.ID = qry_Date.GuestID
WHERE qry_Date.RoomNumber Is Not Null) as t 
PIVOT
(count(Name) FOR [Date] IN( [01/12/2014],[02/12/2014],[03/12/2014],[04/12/2014],[05/12/2014],[06/12/2014],[07/12/2014],[08/12/2014],[09/12/2014],[10/12/2014],[11/12/2014],[12/12/2014],[13/12/2014],[14/12/2014],[15/12/2014],[16/12/2014],[17/12/2014],[18/12/2014],[19/12/2014],[20/12/2014],[21/12/2014],[22/12/2014],[23/12/2014],[24/12/2014],[25/12/2014],[26/12/2014],[27/12/2014],[28/12/2014],[29/12/2014],[30/12/2014],[31/12/2014]) 
 ) as p

One quick way to deal with this error is to convert all data to varchar(max) in same manner. After all dates will become header, so it should be string.

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS VARCHAR(MAX)

SELECT @cols = STUFF((SELECT distinct top 100 percent
                        ',' + QUOTENAME(CAST(qry_Date.Date AS NVARCHAR(MAX)))
                FROM qry_Date
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'');



SET @query =  'SELECT RoomNumber, ' + @cols + '
FROM 
    (SELECT [SirName] +  '' - '' +  [SecondName] AS Name
    ,qry_Date.RoomNumber
    ,CAST(qry_Date.Date AS NVARCHAR(MAX)) as [Date]
FROM Guest RIGHT JOIN qry_DateTemp ON Guest.ID = qry_Date.GuestID
WHERE qry_Date.RoomNumber Is Not Null) as t 
PIVOT
(count(Name) FOR [Date] IN( ' + @cols + ') 
 ) as p'

print @query   
execute(@query)

@DhruvJoshi did it as u Proposed and true i was in error. when i got my results i had to change the query to

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS VARCHAR(MAX)

SELECT @cols = STUFF((SELECT distinct top 100 percent
                        ',' + QUOTENAME(CAST(qry_Date.Date AS NVARCHAR(MAX)))
                FROM qry_Date
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'');



SET @query =  'SELECT RoomNumber, ' + @cols + '
FROM 
    (SELECT [SirName] +  '' - '' +  [SecondName] AS Names
    ,qry_Date.RoomNumber
    ,CAST(qry_Date.Date AS NVARCHAR(MAX)) as [Date]
FROM Guest RIGHT JOIN qry_Date ON Guest.ID = qry_Date.GuestID
WHERE qry_Date.RoomNumber Is Not Null) as t 
PIVOT
(MAX([Names]) FOR [Date] IN( ' + @cols + ') 
 ) as p'

print @query   
execute(@query)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM