2013-02-26 2 views
0

Je suis relativement nouveau dans le développement de sql. Je veux une requête de tableau croisé dynamique. Laissez-moi expliquer mes tables en premier. J'ai une table SalesOrder. Chaque SalesOrder a SalesItems. Chaque élément a un ID de produit et chaque produit a un ID de fabric. Chaque SalesItem a un champ lengthDelivered. En outre plus, chaque salesOrder a un ClienTIDTrès complexe Cross Tab requête dynamique

Maintenant je veux une requête qui énumérera tous les fabricNames dans des colonnes. cela signifie que tous les noms de structure sont des en-têtes de colonne dans mon cas. Dans l'en-tête de ligne, tous les clients seront affichés. Contre chaque client, chaque fabric aura une valeur qui indiquera combien de temps par rapport à ce tissu est vendu à ce client. S'il vous plaît, aidez-moi bientôt. Merci d'avance.

+0

Pouvez-vous publier les définitions réelles? Les instructions 'CREATE TABLE' seraient géniales. Voir ma réponse pour savoir comment faire génériquement un pivot dynamique dans SQL Server. – pyrospade

Répondre

-1

J'ai créé une procédure pour faire cela il y a un certain temps. N'hésitez pas à l'utiliser -

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