我们的企业 GIS 正在升级,某些 SQL 查询需要简化才能工作。升级后,我们无法调用存储过程/运行动态查询或在这些查询中创建临时表。下面的查询使用动态查询创建一个数据透视表,我无法找到解决方法。它输出某些细胞内常见物种的数量。
declare @species varchar(20) = 'BIRDS'
declare @cols varchar(max), @pivot varchar(max) set @cols = (select STUFF((SELECT ','+
quotename(Common_name) FROM Fauna_Species WHERE Species_Type = @species and cell_ref =
'@mapkey' ORDER BY Common_Name FOR XML PATH('')),1,1,'')) set @pivot = ' SELECT ' + @cols +
'FROM (SELECT Common_nam, count(*) count FROM Fauna_Data_2012 WHERE Species_Ty =
'''+@species+''' and cell_ref = ''' + '@mapkey' + ''' GROUP BY Common_nam) AS DP PIVOT
(MIN([count]) FOR Common_nam IN ('+@cols+' )) AS P;'
exec (@pivot)
作为测试,我创建了一个表来保存物种、单元格引用,并且我使用 STUFF 将该单元格的所有 Common_Names 放入一个字段中,以在数据透视查询中使用。
INSERT INTO GIS_Fauna_Fields (Species, CellRef, Common_Name)
SELECT DISTINCT Species_ty, cell_ref, STUFF((SELECT ','+quotename(Common_name)
FROM Fauna_Species f WHERE Species_Type =
Species_ty and f.cell_ref = f2012.cell_ref GROUP BY Common_Name ORDER
BY Common_Name FOR XML PATH('')),1,1,'') FROM Fauna_Data_2012 f2012
然后,每次 GIS 中的用户单击动物单元格时, 后台查询如下所示。
DECLARE @cols varchar(max) set @cols = (SELECT Common_Name FROM
GIS_Fauna_Fields WHERE Species = 'BIRDS' and cellref = '150D4') --cellref will be a variable in the GIS configuration
-- pivots results with count
SELECT @cols FROM (SELECT Common_Nam, count(*) [count] FROM Fauna_Data_2012 WHERE Species_Ty = 'BIRDS' and
cell_ref = '150D4' GROUP BY Common_nam) AS DP PIVOT (MIN([count]) FOR
Common_nam IN (Common_Name)) AS P;
但是,我无法使用变量指定数据点,因此我使用 Common_Name。每个单元格引用的数据都会有所不同,但看起来像这样
[Common Froglet],[Southern Brown Tree Frog],[Verreauxs Tree Frog]
我没有得到想要的结果。我需要包含计数的列名称 (Common_Name),但我得到一个包含 Common_Name 的无名列。
有没有不用动态查询的方法来解决这个问题?
看起来我所要求的可能是不可能的,所以我妥协了一个导出工具,其中包括所选细胞按物种划分的 common_name 计数。