0

私はSQL開発に比較的慣れていません。動的なクロスタブクエリが必要です。最初に私のテーブルについて説明しましょう。私はテーブルSalesOrderを持っています。各SalesOrderにはSalesItemsがあります。各アイテムにはproductIDがあり、各製品にはfabricIDがあります。各SalesItemには、フィールドlengthDeliveredがあります。さらに、各salesOrderにはClienTIDがあります

ここで、すべてのfabricNameを列にリストするクエリが必要です。私の場合、すべてのファブリック名が列ヘッダーであることを意味します。行ヘッダーには、すべてのクライアントが表示されます。すべてのクライアントに対して、すべてのファブリックには、このファブリックに対してこのクライアントに販売される長さを示す値があります。すぐに助けてください。よろしくお願いします。

4

1 に答える 1

-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',
                       @pivot_fields_OUT=@pivot_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
于 2013-02-26T05:19:43.733 に答える