これにはさまざまなアプローチがあるかもしれません。ピボットの後ですべての合計を計算することも、最初に合計を取得してからすべての結果をピボットすることもできます。一種の中間点を持つことも可能です:1 種類の合計 (行単位の合計など) を取得し、ピボットしてから、もう一方の種類を取得しますが、それはやり過ぎかもしれません。
ピボット後にすべての合計を取得する前述のアプローチの最初の方法は、非常に簡単な方法で実行できます。以下の実装で唯一新しい可能性があるのは、 GROUP BY ROLLUP()
:
SELECT [ ] = ISNULL(environment_name, 'Total'), [Enviro] = SUM([Enviro]), [Requi] = SUM([Requi]), [Dev] = SUM([Dev]), [Tsc] = SUM([Tsc]), [TD] = SUM([TD]), [Unkn] = SUM([Unkn]), Total = SUM([Enviro] + [Requi] + [Dev] + [Tsc] + [TD] + [Unkn]) FROM ( SELECT environment_name, root_cause FROM test1 ) s PIVOT ( COUNT(root_cause) FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn]) ) p GROUP BY ROLLUP(environment_name) ;
プレ>基本的に、
GROUP BY ROLLUP()
部分は合計行を生成します あなたのために。グループ化は最初にenvironment_name
によって行われます 、次に総計行が追加されます。逆に、つまり、ピボットする前に合計を取得するには、
GROUP BY CUBE()
を使用できます。 このように:SELECT [ ] = environment_name, [Enviro] = ISNULL([Enviro], 0), [Requi] = ISNULL([Requi] , 0), [Dev] = ISNULL([Dev] , 0), [Tsc] = ISNULL([Tsc] , 0), [TD] = ISNULL([TD] , 0), [Unkn] = ISNULL([Unkn] , 0), Total = ISNULL(Total , 0) FROM ( SELECT environment_name = ISNULL(environment_name, 'Total'), root_cause = ISNULL(root_cause, 'Total'), cnt = COUNT(*) FROM test1 WHERE root_cause IS NOT NULL GROUP BY CUBE(environment_name, root_cause) ) s PIVOT ( SUM(cnt) FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn], Total) ) p ;
プレ>どちらの方法も、SQL Fiddle でテストして試すことができます:
注。単一の列のピボットを解除することは明らかに冗長に思えたため、両方の提案でピボット解除の手順を省略しました。ただし、それ以上のことがある場合は、どちらのクエリも簡単に調整できます。