递归的Select变量
前面有两篇文章提到了类似的问题,但之前不知道有“递归的Select变量”一说,只是叫做”列转行“,今天在书上看到这个说法,现在抄写出来供有需要的朋友参考。
基本语法:
select @variable = @variable + d.column from (Derived Table) d
导出表中的每一行都会与指定的变量拼接起来,从而将基础表中垂直的列数据改为水平方向的列表。
主要应用在以下两种情况:
1:逆规范化数据列表:
DECLARE @EventDates VARCHAR(1024)
SET @EventDates = ''
SELECT @EventDates = @EventDates+CONVERT(VARCHAR(15),A.D,107) + ','
from (select DateBegin as [d] from Event
join Tour
on Event.TourID = Tour.TourID
where Tour.[Name] = 'Out Banks')as a
select left(@EventDates,Len(@EventDates)-1) as test
2:动态交叉表查询:
我们可以使用case方法来创建固定列数的交叉表,前面文章有示例。下面在不指定列值的情况下,实现用静态编码实现的交叉表查询:
DECLARE @XColumns NVARCHAR(1024)
SET @XColumns= ''
SELECT @XColumns = @XColumns + 'SUM(Case X when ''' + [a].[column]+''' THEN Data ELSE 0) AS ' + [a][Column]+','
FROM (SELECT DISTINCT x as [Column] from RawData) as a
SET @XColumns = 'select Y,'+@XColumns +'sum(Data) as Total from RawData group by y order by y'
exec sp_executesql @XColumns
浙公网安备 33010602011771号