2013-02-26 22 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