2015-10-05 2 views
0

У меня есть это:Pivot с крестом и накидной КТР в 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 ')'.

Что я делаю неправильно?

+5

Вы не можете использовать 'ВЫБРАТЬ Name FROM Sysproperties' в функции PIVOT подобных , Если у вас будут неизвестные значения, вам нужно использовать динамический SQL. – Taryn

ответ

1

Вы должны использовать статический список внутри вашего для пункта из поворота или вы можете использовать динамический список, как показано ниже

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 
+0

большое спасибо !!! –