2011-07-27 1 views
1

を動的な列グループを選択:私は、ストアドプロシージャに次のように達成するために必要な動的な列BY

  1. パスパラメータ化カラム名。
  2. パラメータ化された列名を選択し、選択した列で合計グループを指定します。

コード:@の値3を仮定し

CREATE PROCEDURE sproc (
    @column1 NVARCHAR(MAX), 
    @column2 NVARCHAR(MAX), 
    @startdate DATE, 
    @enddate DATE) AS 

BEGIN 

    DECLARE @sqlquery NVARCHAR(MAX) = 'SELECT @column1, @column2, SUM(amountcolumn) 
             FROM tablename 
             WHERE column3 = ''@value3'', 
              datecolumn BETWEEN ''@startdate'' AND ''@enddate'' 
            GROUP BY @column1, @column2'; 

    DECLARE @params NVARCHAR(MAX) = '@column1 VARCHAR(MAX), 
            @column2 VARCHAR(MAX), 
            @startdate DATE, 
            @enddate DATE'; 

    EXEC sp_sqlexec @sqlquery, @params, 
     @column1 = @column1, 
     @column2 = @column2, 
     @startdate = @startdate, 
     @enddate = @enddate; 

END 

GO 
+0

@ value3はどこから来たのですか? –

+0

この動的SQLは、ssrsレポートで使用されるsprocに組み込まれています。 @ value3は、sprocに文字列パラメータとして渡されるコンマで区切られた複数選択値です。 –

+0

@ value3は文字列のリスト、整数のリスト、またはコンマで区切られた値のリストである単一の文字列の値ですか?このカンマ区切り文字列の例と、column3のデータの例を挙げてください。動的に構築しようとする前に、Management Studioで実際のクエリが動作していることをお勧めします(現在の構文はいくつかの点で間違っています)。 –

答えて

1

が文字列で、ストアドプロシージャに別のパラメータであり、datecolumnが実際のDATEであること、そして私はあなたが持つことができるか分からないという事実を無視してグループ化フィールドは、このようなランダムできるスキーマ(あなたがここ最近の他の質問では無視):

DECLARE @sql NVARCHAR(MAX) = N'SELECT ' 
    + @column1 + ', ' + @column2 + ', SUM(amountcolumn) 
    FROM tablename 
    WHERE column3 = ''' + @value3 + ''' 
    AND datecolumn BETWEEN ''' + CONVERT(CHAR(10), @startdate, 120) + ''' 
    AND ''' + CONVERT(CHAR(8), @enddate, 120) + ''' 
    GROUP BY ' + @column1 + ', ' + @column2 + ';'; 

EXEC sp_executesql @sql; 
    -- strongly recommend against sp_sqlexec 
    -- it is undocumented and unsupported 

また、これは想定しています(おそらく行うと、ORDER BYを追加したくなるでしょう順序を気にしませんGROUP BY)。

関連する問題