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

SQL Server 2008で列と行の合計でピボットテーブルを使用する

    これにはさまざまなアプローチがあるかもしれません。ピボットの後ですべての合計を計算することも、最初に合計を取得してからすべての結果をピボットすることもできます。一種の中間点を持つことも可能です: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 でテストして試すことができます:

    注。単一の列のピボットを解除することは明らかに冗長に思えたため、両方の提案でピボット解除の手順を省略しました。ただし、それ以上のことがある場合は、どちらのクエリも簡単に調整できます。



    1. 最新のレコードまたはmysqlの列のすべての個別の値の最大対応日を持つレコードを取得する方法は?

    2. Pluggable Database(PDB)を新しく作成したLISTENERに登録する方法

    3. EloquentのフィールドごとのMySQLの順序

    4. NTILE()がSQLServerでどのように機能するか