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

SQL Server:複数の行を 1 つにまとめた詳細レポート

    動的 SQL を使用してこの問題を解決できます。または、1 セットのデータのみの場合は手動で記述します。どちらの場合も、次のような結果になります:

    SELECT R1.userid, R1.lesson, 
           R1.response as loc_nameA_resp, R1.lable as loc_nameA_labl, R1.weight as loc_nameA_weig, R1.duration_seconds as loc_nameA_dura,
           R2.response as loc_nameB_resp, R2.lable as loc_nameB_labl, R2.weight as loc_nameB_weig, R2.duration_seconds as loc_nameB_dura,
    --- etc for each question
    FROM user U
    JOIN response R1 on R1.userid = u.userid and R1.lesson = 'first' and R1.question = 'loc_nameA'
    JOIN response R2 on R2.userid = u.userid and R2.lesson = 'first' and R2.question = 'loc_nameB'
    --- etc for each question
    WHERE
       U.userid = 'bob' -- this does not need to be bob, whatever user you want.
    

    さあ、テスト済みです。

    DECLARE @sqlSelectList varchar(max);
    DECLARE @sqlJoinList varchar(max);
    
    SELECT @sqlSelectList = '', @sqlJoinList='';
    
    WITH Questions AS
    (
      SELECT DISTINCT question
      FROM ResultsChoices
    )
    SELECT -- We use the question as the alias for join uniqueness,
           -- We could increment a number but why bother?
      @sqlJoinList = @sqlJoinList +
         ' JOIN ResultsChoices '+question+' on '+question+'.userid = u.userid and '+question+'.question = '''+question+'''', 
      @sqlSelectList = @sqlSelectList +
         ', '+question+'.response as '+question+'_resp, '+question+'.label as '+question+'_labl, '+question+'.weight as '+question+'_weig, '+question+'.duration_seconds as '+question+'_dura '
    FROM Questions;
    
    DECLARE @sql NVARCHAR(max);
    
    SET @sql = N'SELECT DISTINCT u.userid ' + @sqlSelectList + N' FROM #ResultsChoices u ' + @sqlJoinList;
    
    EXEC sp_executesql @sql
    



    1. 認証方法'caching_sha2_password'は、使用可能なプラグインのいずれでもサポートされていません

    2. Mysql:タイプがビットの列をクエリする方法は?

    3. 非常に単純なクエリでHAVINGとWHEREの組み合わせに問題がある

    4. SQLServerクエリ-グループごとの乗算