繁体   English   中英

SQL日期透视

[英]Sql Pivoting on date

尝试将以下逻辑转换为SQL查询时出现此错误

逻辑:

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;

以下是我到目前为止所做的

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)

哪个导致错误

消息8114,级别16,状态1,行9将数据类型nvarchar转换为datetime2时出错。 消息473,级别16,状态1,行9 PIVOT操作符中提供了不正确的值“ 13/12/2014”。 消息207,级别16,状态1,第1行无效的列名称“名称”。

我的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

处理此错误的一种快速方法是以相同方式将所有数据转换为varchar(max)。 所有日期都将成为标题之后,因此它应该是字符串。

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按照您的建议完成了,确实我错了。 当我得到结果时,我不得不将查询更改为

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