Saya memiliki beberapa CTE yang semuanya berasal dari tabel yang sama, "table1". Dan yang mereka kembalikan hanyalah hitungan baris. Perbedaan antara masing-masing CTE adalah isi pernyataan where karena saya ingin membandingkan jumlah ketika saya membuat perubahan kecil ini. Kode terlihat seperti:

WITH cte1 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte2 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte3 AS(
SELECT COUNT(*)
FROM table 1
WHERE....
)

Saya ingin mendapatkan output di mana saya mendapatkan semua hitungan dari setiap CTE dan hanya memilikinya dalam satu tabel seperti:

cte1      cte2      cte3
1,564     3,567     2,861
1
qazwsx123 25 Mei 2021, 16:05

2 jawaban

Jawaban Terbaik

Selama semua CTE Anda hanya mengembalikan 1 baris, Anda bisa melakukan produk kartesius dari semuanya (semua dalam klausa dari tanpa bergabung). Saya yakin Anda perlu memberikan alias kolom ke ekspresi count(*) Anda untuk memasukkannya ke dalam CTE Anda juga.

WITH cte1 AS(
 SELECT COUNT(*) cnt 
 FROM table1
 WHERE....
), cte2 AS(
 SELECT COUNT(*) cnt
 FROM table1
 WHERE....
), cte3 AS(
 SELECT COUNT(*) cnt
 FROM table 1
 WHERE....
)
SELECT cte1.cnt AS cte1, cte2.cnt AS cte2, cte3.cnt AS cte3
FROM cte1, cte2, cte3

Juga jika Anda tidak memiliki gabungan apa pun di CTE Anda, Anda berpotensi menjalankan penghitungan secara bersamaan dengan menggunakan ekspresi jumlah kasus yang dapat meningkatkan kinerja.

SELECT SUM(CASE WHEN /* where clause 1 */ THEN 1 ELSE 0 END) cte1,
       SUM(CASE WHEN /* where clause 2 */ THEN 1 ELSE 0 END) cte2,  
       SUM(CASE WHEN /* where clause 3 */ THEN 1 ELSE 0 END) cte3
FROM table1
2
Gordon Linoff 25 Mei 2021, 15:05
SELECT
  (SELECT COUNT(*) FROM table1 WHERE....) as cte1,
  (SELECT COUNT(*) FROM table1 WHERE....) as cte2,
  (SELECT COUNT(*) FROM table1 WHERE....) as cte3
0
Sergey Geron 25 Mei 2021, 13:13