2011-08-04 15 views
4

チェリー!SQL Server条件付きグループBy

10個のnchar(1)列を保持するSQL Server 2008テーブルがあります。私は、テーブルを照会するストアドプロシージャを作成して、10個のカラムの任意の組み合わせでカウントを集計しようとしていました。例えば、私は、テーブル内のこれらの行を持っていると言う:

| COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10 
+======+======+======+======+======+======+======+======+======+====== 
| T | P | 9 | C | ) | N | N | S | X | X 
| T | P | 9 | 7 | 0 | * | N | Q | X | X 
| T | P | I | B | ( | H | N | S | X | X 
| T | P | A | A | G | S | N | 6 | X | X 

私は、列1および3のグループのことができるようにして取得したい:

COUNT | COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10 
+=====+======+======+======+======+======+======+======+======+============= 
| 2 | T | - | 9 | - | - | - | - | - | - | - 
| 1 | T | - | A | - | - | - | - | - | - | - 
| 1 | T | - | I | - | - | - | - | - | - | - 

または私はグループでのことができるようにしたいです列1、2、8を取得して取得する:

私は動的にクライアント側でクエリを作成して実行できると思います。私はそれが今、最も簡単な解決策になると思う。しかし、将来的には、動的SQLを使用せずにサーバー側でを実行する簡単な方法がありますか?さて、私はいつも動的SQLを、普通はという悪い考えで読んでいます。この場合、それが好ましい方法でしょうか?

は(私はstackoverflow.comエチケットに従っていない場合は、あまりにも悪い私を炎しないようにしてください。それを指摘し、私はより良い次回を行うにしようとするでしょうしてください。)

答えて

5
CREATE PROCEDURE GetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
AS 
SELECT 
    COUNT = COUNT(*), 
    CASE @col1 WHEN 1 THEN COL1 END COL1, 
    CASE @col2 WHEN 1 THEN COL2 END COL2, 
    CASE @col3 WHEN 1 THEN COL3 END COL3, 
    CASE @col4 WHEN 1 THEN COL4 END COL4, 
    CASE @col5 WHEN 1 THEN COL5 END COL5, 
    CASE @col6 WHEN 1 THEN COL6 END COL6, 
    CASE @col7 WHEN 1 THEN COL7 END COL7, 
    CASE @col8 WHEN 1 THEN COL8 END COL8, 
    CASE @col9 WHEN 1 THEN COL9 END COL9, 
    CASE @col10 WHEN 1 THEN COL10 END COL10 
FROM YourTable 
GROUP BY 
    CASE @col1 WHEN 1 THEN COL1 END, 
    CASE @col2 WHEN 1 THEN COL2 END, 
    CASE @col3 WHEN 1 THEN COL3 END, 
    CASE @col4 WHEN 1 THEN COL4 END, 
    CASE @col5 WHEN 1 THEN COL5 END, 
    CASE @col6 WHEN 1 THEN COL6 END, 
    CASE @col7 WHEN 1 THEN COL7 END, 
    CASE @col8 WHEN 1 THEN COL8 END, 
    CASE @col9 WHEN 1 THEN COL9 END, 
    CASE @col10 WHEN 1 THEN COL10 END 

UPDATE結果のクエリを動的に構築されていないので、あなたはテーブル値関数としてそれを実装することができますところで

、:

CREATE FUNCTION fnGetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
RETURNS TABLE 
AS 
RETURN (
    SELECT 
    … 
) 

とSPからではなく、それを呼び出す:

事がある
CREATE PROCEDURE GetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
AS 
SELECT * 
FROM fnGetGroups(@Col1, @Col2, @Col3, @Col4, @Col5, 
       @Col6, @Col7, @Col8, @Col9, @Col10) 

、TVFは、SPはアプリケーションから直接呼び出すことが望ましい可能性がありながら、様々なSQLスクリプトで使用するために手軽ことができます。

+0

うわー。驚くばかり。ありがとうございました。 – Frank