SQL - 使用 pivot 命令时出错
SQL - error when using pivot command
我在使用 pivot 命令时遇到问题 - 我收到以下错误
"Invalid column name '2013-03-22'. Invalid column name '2013-03-29'. Invalid column name '2013-04-05'. Invalid column name 'Volume'. Invalid column name 'Week Ending Date'."
当运行这个代码
SELECT *
FROM
(
SELECT [Area],
[Region],
[Channel],
[Controller],
[2013-03-22] AS _dt1,
[2013-03-29] AS _dt2,
[2013-04-05] AS _dt3
FROM [DataTable]
) AS SourceTable
PIVOT
(
SUM ([Volume])
FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], [2013-04-05])
) AS PivotTable
它似乎符合正确的格式。有什么想法吗?
通常我动态地做我的数据透视列,然后我 运行 执行 sp_executesql @query
找到不同的日期“2013-03-22”...然后将其转换为字符串
使用 STUFF 和 XML PATH
在您的嵌入式 SQL 查询中替换它
所以您永远不会对您的列进行硬编码
这里的例子我有
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT N',' + QUOTENAME(c.name)
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE t.name = 'tagCloudLibrary'
and c.name not in ('langID')
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = N'SELECT ' + @cols + N' from tagCloudLibrary'
execute sp_executesql @query;
如果您的 PIVOT 正确,请在此处为 STUFF 执行 CORRECT WHERE CLAUSE...
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT top 10 N',' + QUOTENAME(LastActivityDate)
FROM DataTable
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
select @cols
set query = N'SELECT * FROM
(SELECT [Area], [Region], [Channel], [Controller], ' + @cols
+ N' FROM [DataTable]) AS SourceTable '
+ N' PIVOT (SUM ([Volume]) FOR [Week Ending Date] IN (' + @cols + ') AS PivotTable '
execute sp_executesql @query;
似乎源 table 不应 包含要旋转的列的值,但 应该 包含列包含要旋转的值和要旋转的值。见下文:
SELECT [Area],
[Region],
[Channel],
[Controller],
[2013-03-22] as _dt1,
[2013-03-29] as _dt2,
[2013-04-05] as _dt3
FROM
(
SELECT [Area],
[Region],
[Channel],
[Controller],
[Volume],
[Week Ending Date]
FROM [DataTable]
) AS SourceTable
PIVOT(SUM ([Volume]) FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29],
[2013-04-05]))
AS PivotTable
我在使用 pivot 命令时遇到问题 - 我收到以下错误
"Invalid column name '2013-03-22'. Invalid column name '2013-03-29'. Invalid column name '2013-04-05'. Invalid column name 'Volume'. Invalid column name 'Week Ending Date'."
当运行这个代码
SELECT *
FROM
(
SELECT [Area],
[Region],
[Channel],
[Controller],
[2013-03-22] AS _dt1,
[2013-03-29] AS _dt2,
[2013-04-05] AS _dt3
FROM [DataTable]
) AS SourceTable
PIVOT
(
SUM ([Volume])
FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], [2013-04-05])
) AS PivotTable
它似乎符合正确的格式。有什么想法吗?
通常我动态地做我的数据透视列,然后我 运行 执行 sp_executesql @query
找到不同的日期“2013-03-22”...然后将其转换为字符串 使用 STUFF 和 XML PATH
在您的嵌入式 SQL 查询中替换它
所以您永远不会对您的列进行硬编码
这里的例子我有
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT N',' + QUOTENAME(c.name)
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE t.name = 'tagCloudLibrary'
and c.name not in ('langID')
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = N'SELECT ' + @cols + N' from tagCloudLibrary'
execute sp_executesql @query;
如果您的 PIVOT 正确,请在此处为 STUFF 执行 CORRECT WHERE CLAUSE...
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT top 10 N',' + QUOTENAME(LastActivityDate)
FROM DataTable
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
select @cols
set query = N'SELECT * FROM
(SELECT [Area], [Region], [Channel], [Controller], ' + @cols
+ N' FROM [DataTable]) AS SourceTable '
+ N' PIVOT (SUM ([Volume]) FOR [Week Ending Date] IN (' + @cols + ') AS PivotTable '
execute sp_executesql @query;
似乎源 table 不应 包含要旋转的列的值,但 应该 包含列包含要旋转的值和要旋转的值。见下文:
SELECT [Area],
[Region],
[Channel],
[Controller],
[2013-03-22] as _dt1,
[2013-03-29] as _dt2,
[2013-04-05] as _dt3
FROM
(
SELECT [Area],
[Region],
[Channel],
[Controller],
[Volume],
[Week Ending Date]
FROM [DataTable]
) AS SourceTable
PIVOT(SUM ([Volume]) FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29],
[2013-04-05]))
AS PivotTable