Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan tabel pivot dengan total kolom dan baris di sql server 2008

Mungkin ada berbagai pendekatan untuk ini. Anda dapat menghitung semua total setelah pivot, atau Anda bisa mendapatkan totalnya terlebih dahulu, lalu memutar semua hasilnya. Dimungkinkan juga untuk memiliki semacam jalan tengah:dapatkan satu jenis total (misalnya yang berdasarkan baris), pivot, lalu dapatkan jenis lainnya, meskipun itu mungkin berlebihan.

Pendekatan pertama yang disebutkan, mendapatkan semua total setelah pivot, dapat dilakukan dengan cara yang sangat mudah, dan satu-satunya hal yang berpotensi baru bagi Anda dalam implementasi di bawah ini mungkin 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)
;

Pada dasarnya, GROUP BY ROLLUP() bagian menghasilkan Total baris untukmu. Pengelompokan pertama dilakukan oleh environment_name , lalu baris total keseluruhan ditambahkan.

Untuk melakukan sebaliknya, yaitu mendapatkan total sebelum berputar, Anda dapat menggunakan GROUP BY CUBE() seperti ini:

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
;

Kedua metode dapat diuji dan dimainkan di SQL Fiddle:

Catatan. Saya telah menghilangkan langkah unpivoting di kedua saran karena unpivoting satu kolom tampak jelas berlebihan. Namun, jika ada lebih dari itu, menyesuaikan salah satu kueri seharusnya mudah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan semua Tabel dengan atau tanpa Batasan Kunci Utama di Database Sql Server - Tutorial SQL Server / TSQL 59

  2. Sisipkan SQL Server jika tidak ada

  3. Memantau Penghitung Kinerja melalui PERFMON | Pemecahan Masalah Kinerja SQL Server -3

  4. SQL OUTPUT Stored Procedures tidak berfungsi dengan ExecuteReader

  5. Cara Menggunakan Fungsi T-SQL SQL Server SUM:5 Kasus Penggunaan