sql >> データベース >  >> RDS >> Sqlserver

db データを表示する SQL クエリ

    データをピボットしようとしています - 列データを行に変更します。古い学校の方法は、CASE ステートメント - SQL Server 2005 以降では、 を使用できますピボット 指図。 PIVOT の例を提供するのは他の人に任せます。

    SELECT t.memberid,
           CASE WHEN t.questionno = 1 THEN t.answerno ELSE NULL END AS 1,
           CASE WHEN t.questionno = 2.1 THEN t.answerno ELSE NULL END AS 2.1,
           CASE WHEN t.questionno = 2.2 THEN t.answerno ELSE NULL END AS 2.2,
           CASE WHEN t.questionno = 3 THEN t.answerno ELSE NULL END AS 3
           CASE WHEN t.questionno = 5 THEN t.answerno ELSE NULL END AS 5
           CASE WHEN t.questionno = 7 THEN t.answerno ELSE NULL END AS 7
      FROM ANSWER t
    

    questionno 列のデータ型が明確ではありません。必要に応じて更新してください。

    ユーザーが独自の質問を定義できる場合は、動的 SQL を使用する必要があります .最初に質問番号のリストを取得し、次にそれらの結果に基づいて CASE ステートメントを作成する必要があります。 PIVOT についても同様です...

    DECLARE @SQL nvarchar(4000)
    DECLARE @questionno [data type here]
    
    SET @SQL = 'SELECT t.memberid,'
    
    DECLARE c1 CURSOR READ_ONLY FOR
      SELECT t.questionno
        FROM ANSWER t
    GROUP BY t.questionno
    ORDER BY t.questionno
    
    OPEN c1
    
    FETCH NEXT FROM c1 INTO @questionno 
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
      SET @SQL = @SQL + ' CASE WHEN t.questionno = '+ @questionno +' THEN t.answerno ELSE NULL END AS '+ @questionno','
    
      FETCH NEXT FROM c1 INTO @questionno 
    END
    
    CLOSE c1
    DEALLOCATE c1
    
    SET @SQL = @SQL + 'NULL FROM ANSWER t '
    
    EXEC(@SQL)
    

    NULL FROM ...最後の CASE ステートメントから来るカンマを取り除くのが面倒だからです.



    1. SQL Server2008でテーブルエイリアスを使用してUPDATESQLを作成するにはどうすればよいですか?

    2. PHPとMySQLを使用して単一のチェックボックスを検証する方法

    3. SQLServer2012で機能しないT-SQLCTEマテリアライズ手法

    4. SQLDeveloper4.1.3がリリースされました