【问题标题】:Sql Pivoting on dateSql 透视日期
【发布时间】:2018-06-14 17:47:52
【问题描述】:

尝试将以下逻辑转换为 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, Level 16, State 1, Line 1 列名'Name'无效。

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

【问题讨论】:

  • print @query 长什么样子?
  • 它的简单日期解析错误。以支持的格式提供您的日期,因为 mm/dd/yyyy 格式使您的日期无效。
  • Tx Rafal。 i 将 convert(NVARCHAR(MAX),qry_Date.Date,103) 更改为 convert(NVARCHAR(MAX),qry_Date.Date),现在仍然存在一个错误“列名 'Name' 无效。”

标签: sql sql-server tsql


【解决方案1】:

处理此错误的一种快速方法是以相同的方式将所有数据转换为 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)

【讨论】:

  • “铸造所有日期”我从未想过。 Tx @DhruvJoshi.一个错误仍然“无效的列名'Name'。”
  • 那是因为您正在对 Name 进行 pIvoting,它在 Select 列表中将不可用。选择列表将只有 @cols 和 RoomNumber
【解决方案2】:

@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)

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多