简体   繁体   English

SQL日期透视

[英]Sql Pivoting on date

I am getting this error when trying to convert the below logic in to SQL query 尝试将以下逻辑转换为SQL查询时出现此错误

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. 消息8114,级别16,状态1,行9将数据类型nvarchar转换为datetime2时出错。 Msg 473, Level 16, State 1, Line 9 The incorrect value "13/12/2014" is supplied in the PIVOT operator. 消息473,级别16,状态1,行9 PIVOT操作符中提供了不正确的值“ 13/12/2014”。 Msg 207, Level 16, State 1, Line 1 Invalid column name 'Name'. 消息207,级别16,状态1,第1行无效的列名称“名称”。

My print @query output 我的print @query输出

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. 处理此错误的一种快速方法是以相同方式将所有数据转换为varchar(max)。 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. @DhruvJoshi按照您的建议完成了,确实我错了。 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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