2013-02-26 96 views
0

我是一个比较新的SQL开发。我想要一个动态的交叉表查询。首先让我解释我的表格。我有一张表SalesOrder。每个SalesOrder都有SalesItems。每个产品都有productID,每个产品都有fabricID。每个SalesItem都有一个字段lengthDelivered。 此外,每个salesOrder都有一个ClienTID非常复杂的交叉表动态查询

现在我想要一个将列出所有fabricNames列的查询。这意味着我所有的结构名称都是列标题。在行标题中,将显示所有客户端。针对每一位客户,每种面料的价值都会体现出这种面料销售给这位客户的长度。请尽快帮助我。提前Thanx。

+0

你能发表实际的表定义吗? 'CREATE TABLE'语句会很棒。查看我的答案,了解如何在SQL Server中一般地执行动态数据透视。 – pyrospade 2013-02-26 05:25:13

回答

-1

我创建了一个程序来做这个回来。随意使用它 -

CREATE PROCEDURE do_pivot 
    @table sysname,      -- Name of the table with source data to pivot 
    @column_field sysname,    -- Field used to generate new columns 
    @value_field sysname = '',   -- Values to group within new columns 
    @order_by sysname = NULL,   -- Optional order by field 
    @function sysname = MAX,   -- Optional function to perform on values 
    @reverse_columns bit = 0   -- If set to 1, reverses order of pivoted columns 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    declare @pivot_fields nvarchar(max); 

    declare @sql nvarchar(max) = N' 
     -- Get unique values 
     set @pivot_fields_OUT = (
      select distinct ''['' + CAST(' + @column_field + ' as nvarchar(max)) + ''],'' 
      from ' + @table + ' 
      order by 1 ' + case 
       when @reverse_columns = 0 then 'asc' else 'desc' 
      end + ' 
      for xml path('''') 
     ); 
     -- Remove last comma 
     set @pivot_fields_OUT = LEFT(@pivot_fields_OUT, LEN(@pivot_fields_OUT) - 1); 
    '; 

    exec sp_executesql @sql, N'@pivot_fields_OUT nvarchar(max) OUTPUT', 
         @[email protected]_fields OUTPUT; 

    set @sql = N' 
     select * 
     from ' + @table + ' 
     pivot (
      ' + @function + '(' + @value_field + ') 
      for ' + @column_field + ' in (' + @pivot_fields + ') 
     ) as pvt ' + case 
      when @order_by is null then '' 
      else 'order by ' + @order_by 
     end; 

    exec(@sql); 

END