2011-07-25 3 views
2

を使用することによって、私はT-SQLの動的GROUP @parameters

SELECT @param1, @param2, @param3, t.field1, sum(t.amount) 
FROM table t 
WHERE t.field 2 IS NOT NULL AND 
t.field3ID = '12345' 
GROUP BY @param1, @param2, @param3 

最善のアプローチは何を達成したいと思いますか?動的SQLを構築する方法はありますか?

+0

param1、param2、その他はフィールドの名前を保持することはできますか? – JohnFx

答えて

5

動的SQLがここに行く唯一の方法です。ただし、オプションのグループ化列がある場所はどのような種類のテーブルですか?

0

明示的にクエリに渡す値でグループ化する必要があるのはなぜですか?

select文から@ param1/2/3を削除し、グループを削除して通常の選択をします。あなたのコードでは、結果を期待しているものにパラメータを追加してください。それ以外の場合は、ネットワークトラフィックを作成しているだけです。

0

あなたのパラメータがフィールド名を保持していると大胆に想定しています。そうでなければ、あなたがそこにいる理由はありません。

グループ化されたアイテムはグループ内でまったく同じ値が含まれている場合、あなたはこのようminまたはmaxを使用してグループ化せずに行うことができますが:

SELECT Min(@param1), Min(@param2), Min(@param3), t.field1, sum(t.amount) 
FROM table t 
WHERE t.field 2 IS NOT NULL AND 
t.field3ID = '12345' 

あなたはまだ問題がそのフィールドを持っているでしょうこのように選択することはできません

あなたはcase文を使用することができ、これは動作しますが、文でグループを取り除きたい場合は、上から「最小/最大」の哲学と組み合わせることができます:私はあなたが選ぶことができると思い

SELECT 
    case 
     when @param1 = 'colname1' then colname1 
     when @param1 = 'colname2' then colname2 
     when @param1 = 'colname2' then colname3 
     else null 
    end, 
    case 
     when @param2 = 'colname1' then colname1 
     when @param2 = 'colname2' then colname2 
     when @param2 = 'colname2' then colname3 
     else null 
    end, 
    case 
     when @param3 = 'colname1' then colname1 
     when @param3 = 'colname2' then colname2 
     when @param3 = 'colname2' then colname3 
     else null 
    end, 
    t.field1, 
    sum(t.amount) 
FROM table t 
WHERE t.field2 IS NOT NULL AND 
t.field3ID = '12345' 
GROUP BY 
    case 
     when @param1 = 'colname1' then colname1 
     when @param1 = 'colname2' then colname2 
     when @param1 = 'colname2' then colname3 
     else null 
    end, 
    case 
     when @param2 = 'colname1' then colname1 
     when @param2 = 'colname2' then colname2 
     when @param2 = 'colname2' then colname3 
     else null 
    end, 
    case 
     when @param3 = 'colname1' then colname1 
     when @param3 = 'colname2' then colname2 
     when @param3 = 'colname2' then colname3 
     else null 
    end, 
    t.field1 

以下のソリューション間:

  • 使用の動的SQLクライアント側で必要なすべてのフィールドとフィルタフィールドを選択し、複数のPROCを作成します。 edures
  • ユースケース文

それはすべてあなたがそれを使用しようとしている方法によって異なります。すべてt.field1の

+0

nullでグループ化することはできませんが、うまくいけばその状況は起こりません。 –

+0

はい、まさにです。私が見ているように、それが起こったときにそれが壊れれば、役に立つでしょう。それ以外の場合は、適切なデフォルト列を選択してください。 –

+0

実際にはnullでグループ化できます。私はちょうどそれをテストした。申し訳ありません。ここでそれをテストすることができますhttp://data.stackexchange.com/stackoverflow/q/107547/これは本当にクールです –

1

まずもして、グループ内にあるか、ここにあなたが使用できる動的SQLのビットがあるaggrigate分のような機能や

最大とSQLで扱わなければなりません。それはあなたが異なる数のパラメータを使用することを可能にします

DECLARE @t TABLE (COLUMNNAME varchar(15)) 
DECLARE @pstring VARCHAR(1000), @sqlstring varchar(5000) 

DECLARE @param1 VARCHAR(15) 
DECLARE @param2 VARCHAR(15) 
DECLARE @param3 VARCHAR(15) 
--declare more columns here 

SET @param1 = <colname> -- replace this <colname> 
SET @param2 = <colname> 
SET @param3 = <colname> 
--set the name of the column 

INSERT @t SELECT @param1 
UNION ALL SELECT @param2 
UNION ALL SELECT @param3 
--union all select @param4 etc 

SELECT @pstring = COALESCE(@pstring, '') + columnname+',' FROM @t 

SET @sqlstring = 'SELECT '[email protected] + 'min(t.field1) field1, sum(t.amount) 
FROM table t 
WHERE t.field2 IS NOT NULL AND 
t.field3ID = ''12345'' 
GROUP BY ' +stuff(@pstring,len(@pstring), 1,'') 

EXEC(@sqlstring) 
+1

これは動作するはずです。 'COALESCE(@pstring、 '')+ columnname + '、' 'は' COALESCE(@ pstring +'、 '、' ')+ columnname'に変更することができます。コンマ(後で 'STUFF()'を使う必要はありません)。しかし、「min(t。field1) 'はカンマで始まります。 –