-1

私はこのスキーマを持つテーブルを持っています:

tbl結果

Question1 | Question2 | Question3 | etc | etc | Question240 |

これらの列の値は次のいずれかになります。

1, 2, 3, 4, N, M

次のようなデータを提示する必要があります。

| QuestionNumber | 1 | 2 | 3 | 4 | N | M |
------------------------------------------
| Question1      | 53| 27| 10| 5 | 2 | 3 |
| etc            | 20| 40| 32| 8 | 0 | 0 | <-- These values being % (but I can do the calculation later).
| etc            |

結果セットが出力する行数を制御できる必要があります。私は次のようにしてこれを行いました(3列のみ):

DECLARE @cname VARCHAR(MAX)
SELECT @cname = STUFF((
    SELECT ', ' + COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (TABLE_NAME = 'tblResults') AND (ORDINAL_POSITION BETWEEN 8 AND 10)
    FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 1,1,'')

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT Answers, CASE WHEN Answer = '''' THEN ''N'' ELSE Answer END AS Answer, COUNT(Answer) AS Total
            FROM (
                SELECT '+@cname+'
                FROM tblResults
                WHERE (something = ''006'') AND (somethingElse = ''ABC'')
                ) AS MyTable
            UNPIVOT (Answer FOR Answers IN ('+@cname+')) AS MyUnPivot
            GROUP BY Answers, Answer
            ORDER BY Answers, Answer'

exec sp_executesql @sql

これにより、次の結果セットが生成されます。

| Answers | Answer | Total |
----------------------------
|Question1|    1   | 12474 |
|Question1|    2   | 188   |
|Question1|    3   | 200   |
|Question1|    4   | 5     |
|Question1|    N   | 0     |
|Question1|    M   | 142   |
|Question2|    1   | 14521 |
|etc      |        |       |
|etc      |        |       |

したがって、これを行う他の方法が考えられないため、私の計画は動的 SQL を使用することでした。さまざまな UNPIVOT メソッドを試しましたが、進歩していないようです。

Beofre 誰もがこれがどんなにひどい設計であるかを示唆していますが、それは私が継承したものであり、サードパーティのアプリケーションを書き直さない限り変更することはできません。

誰かがより良いタイトルを考えることができる場合は、編集してください.

ありがとう。

4

1 に答える 1