none
Pivotの結果を並び変える方法を教えてください。 RRS feed

  • 質問

  • お世話になります。

    以下のようなPivotを使用して年月でクロス集計しているのですが、集計結果を特定の列で並び変えて上位10件(Top10)にする方法を教えていただけないでしょうか?

    BEGIN DECLARE @sqlstr varchar(max), @sqldatas varchar(max), @target varchar(50); DECLARE cur CURSOR FOR SELECT DISTINCT TOP 5 YM
    FROM (SELECT USER_NAME,CONVERT(Varchar(7),ACCESS_TIMESTAMP,111)AS YM
    FROM DPV$) AS Derivedtbl1 ORDER BY YM DESC;
    SET  @sqldatas = '';
    SET  @sqlstr = 'SELECT USER';
    OPEN cur; IF @@CURSOR_ROWS = 0 RETURN; FETCH next FROM cur INTO @target;
    WHILE (@@fetch_status <> - 1) BEGIN IF len(@sqldatas) > 0
    BEGIN SET  @sqldatas = @sqldatas + ,' END; SET  @sqldatas = @sqldatas + '[' + @target + ']'
    SET  @sqlstr = @sqlstr + ',[' + @target + '] as [' + @target + ']';
    FETCH next FROM  cur INTO  @target; END; CLOSE cur; DEALLOCATE cur;
    SET   @sqlstr = @sqlstr + ' FROM (select  USER_NAME as USER, YM
    FROM (select USER_NAME, CONVERT (Varchar(7), ACCESS_TIMESTAMP, 111) AS YM
    from  DPV$) AS Derivedtbl1) T PIVOT (Count([YM]) FOR [YM] IN ';
    SET   @sqlstr = @sqlstr + '(' + @sqldatas + ')) AS PIVOT_TABLE'; EXECUTE (@sqlstr); END; 

     

    よろしくお願いします。

    2011年6月10日 4:14

回答

  • CTE(共通テーブル式)を使えばできるんじゃないかと思います。
    #以下のコードは未検証です。並べ替える特定の列が不明だったので適当に書いています。また、PIVOT_TABLEの後に半角スペースを追加しているので気を付けて下さい。

    SET   @sqlstr = 'with CTE as (' + @sqlstr + ' FROM (select  USER_NAME as USER, YM
    FROM (select USER_NAME, CONVERT (Varchar(7), ACCESS_TIMESTAMP, 111) AS YM
    from  DPV$) AS Derivedtbl1) T PIVOT (Count([YM]) FOR [YM] IN ';
    SET   @sqlstr = @sqlstr + '(' + @sqldatas + ')) AS PIVOT_TABLE ';
    SET   @sqlstr = @sqlstr + 'select top(100) * from CTE order by 特定の列';
    EXECUTE (@sqlstr);

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2011年6月21日 8:42
    • 回答としてマーク 山本春海 2011年6月29日 8:40
    2011年6月12日 6:37

すべての返信

  • CTE(共通テーブル式)を使えばできるんじゃないかと思います。
    #以下のコードは未検証です。並べ替える特定の列が不明だったので適当に書いています。また、PIVOT_TABLEの後に半角スペースを追加しているので気を付けて下さい。

    SET   @sqlstr = 'with CTE as (' + @sqlstr + ' FROM (select  USER_NAME as USER, YM
    FROM (select USER_NAME, CONVERT (Varchar(7), ACCESS_TIMESTAMP, 111) AS YM
    from  DPV$) AS Derivedtbl1) T PIVOT (Count([YM]) FOR [YM] IN ';
    SET   @sqlstr = @sqlstr + '(' + @sqldatas + ')) AS PIVOT_TABLE ';
    SET   @sqlstr = @sqlstr + 'select top(100) * from CTE order by 特定の列';
    EXECUTE (@sqlstr);

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2011年6月21日 8:42
    • 回答としてマーク 山本春海 2011年6月29日 8:40
    2011年6月12日 6:37
  • こんにちは、tosaito3 さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    参考になる情報をいただいているようでしたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    trapemiya さん、情報ありがとうございました。

    tosaito3 さん、その後いかがでしょうか。
    まだ問題が解決していない場合には、不明点など詳細を投稿いただいたほうが有効な情報が得られるかもしれません。
    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                                    
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年6月29日 8:40