在 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