递归的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

posted @ 2010-06-02 15:53  草市江田  阅读(261)  评论(0)    收藏  举报