在 SQL 服务器中使用交叉和联合 CTE 进行透视
Pivot with cross and union CTE in SQL Server
我有这个:
SELECT *
FROM
(SELECT
tblLandAreas.LandAreaId, Sysproperties.Name,
tblLandAreaPropertyValues.Value
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE
SysProperties.SysPropertyId = tblLandAreaProperties.SysPropertyId
AND tblLandAreas.LandAreaId = '1175'
UNION ALL
SELECT DISTINCT
(tblLandAreas.LandAreaId), Sysproperties.Name, null
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE tblLandAreas.LandAreaId = '1175') AS SourceTable
PIVOT
(
MAX(SourceTable.Value)
FOR SourceTable.Name IN (SELECT Name FROM Sysproperties)
) AS PivotTable
我收到了这个错误:
Msg 156, Level 15, State 1, Line 22
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 22
Incorrect syntax near ')'.
我做错了什么?
您需要在 pivot 的 for 子句中使用静态列表,或者您可以使用如下所示的动态列表
DECLARE @col NVARCHAR(MAX)
SELECT @col= STUFF(( select distinct ',[' + Name +']'FROM Sysproperties for XML path ('')),1,1,'')
DECLARE @query NVARCHAR(MAX)
SET @query = '
SELECT *
FROM
(SELECT
tblLandAreas.LandAreaId, Sysproperties.Name,
tblLandAreaPropertyValues.Value
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE
SysProperties.SysPropertyId = tblLandAreaProperties.SysPropertyId
AND tblLandAreas.LandAreaId = ''1175''
UNION ALL
SELECT DISTINCT
(tblLandAreas.LandAreaId), Sysproperties.Name, null
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE tblLandAreas.LandAreaId = ''1175'') AS SourceTable
PIVOT
(
MAX(SourceTable.Value)
FOR SourceTable.Name IN (' + @col + ')
) AS PivotTable'
EXEC SP_EXECUTESQL @query
我有这个:
SELECT *
FROM
(SELECT
tblLandAreas.LandAreaId, Sysproperties.Name,
tblLandAreaPropertyValues.Value
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE
SysProperties.SysPropertyId = tblLandAreaProperties.SysPropertyId
AND tblLandAreas.LandAreaId = '1175'
UNION ALL
SELECT DISTINCT
(tblLandAreas.LandAreaId), Sysproperties.Name, null
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE tblLandAreas.LandAreaId = '1175') AS SourceTable
PIVOT
(
MAX(SourceTable.Value)
FOR SourceTable.Name IN (SELECT Name FROM Sysproperties)
) AS PivotTable
我收到了这个错误:
Msg 156, Level 15, State 1, Line 22
Incorrect syntax near the keyword 'SELECT'.Msg 102, Level 15, State 1, Line 22
Incorrect syntax near ')'.
我做错了什么?
您需要在 pivot 的 for 子句中使用静态列表,或者您可以使用如下所示的动态列表
DECLARE @col NVARCHAR(MAX)
SELECT @col= STUFF(( select distinct ',[' + Name +']'FROM Sysproperties for XML path ('')),1,1,'')
DECLARE @query NVARCHAR(MAX)
SET @query = '
SELECT *
FROM
(SELECT
tblLandAreas.LandAreaId, Sysproperties.Name,
tblLandAreaPropertyValues.Value
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE
SysProperties.SysPropertyId = tblLandAreaProperties.SysPropertyId
AND tblLandAreas.LandAreaId = ''1175''
UNION ALL
SELECT DISTINCT
(tblLandAreas.LandAreaId), Sysproperties.Name, null
FROM tbllandareas
LEFT JOIN tblLandAreaProperties ON tblLandAreaProperties.LandAreaId = tblLandAreas.LandAreaId
LEFT JOIN tblLandAreaPropertyValues ON tblLandAreaProperties.LandAreaPropertyId = tblLandAreaPropertyValues.LandAreaPropertyId
CROSS JOIN Sysproperties SysProperties
WHERE tblLandAreas.LandAreaId = ''1175'') AS SourceTable
PIVOT
(
MAX(SourceTable.Value)
FOR SourceTable.Name IN (' + @col + ')
) AS PivotTable'
EXEC SP_EXECUTESQL @query