SQL Academy · Pelajaran

CASE dalam ORDER BY dan Agregat

Pengisihan dan pengiraan bersyarat.

Pelajaran 4 daripada 413 langkah

CASE dalam ORDER BY dan Agregat ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Mengisih dengan Keutamaan Tersuai

Klausa ORDER BY SQL biasanya mengisih baris mengikut nilai semula jadi sesuatu lajur. Namun, anda boleh menyematkan ungkapan CASE dalam ORDER BY untuk menghasilkan susunan isihan yang tersuai sepenuhnya — susunan yang tidak dapat dihasilkan oleh mana-mana satu lajur secara bersendirian.

Teknik ini berguna apabila peraturan perniagaan menentukan keutamaan, bukannya nilai data mentah.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

Cara CASE dalam ORDER BY Berfungsi

Apabila pangkalan data menilai ORDER BY CASE ... END, ia mengira integer (atau sebarang nilai yang boleh dibandingkan) bagi setiap baris. Baris kemudiannya diisih berdasarkan nilai yang dikira itu, bukannya — atau sebagai tambahan kepada — lajur mentah.

Ungkapan CASE tidak disimpan; ia hanya wujud sepanjang tempoh pertanyaan.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

Mengisih NULL secara Jelas

Secara lalai, pangkalan data yang berbeza meletakkan NULL pada awal atau akhir hasil isihan dengan cara yang berbeza. CASE dalam ORDER BY membolehkan anda menentukan dengan tepat kedudukan NULL — tanpa mengira enjin pangkalan data yang digunakan.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

Susunan Menaik dan Menurun Bersyarat

CASE dalam ORDER BY juga boleh meniru arah isihan bersyarat. Dengan memetakan nilai kategori kepada nombor negatif, anda boleh membalikkan susunan isihan secara berkesan untuk kumpulan tertentu sambil mengekalkan susunan biasa bagi kumpulan lain.

Ini berguna apabila jenis baris yang berbeza memerlukan logik isihan yang berbeza dalam satu set hasil.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE dalam COUNT

Anda boleh menyematkan ungkapan CASE dalam fungsi agregat seperti COUNT. Caranya adalah dengan mengembalikan nilai bukan NULL bagi baris yang ingin dikira, dan NULL bagi baris yang ingin dilangkau — kerana COUNT mengabaikan NULL.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE dalam SUM — Jumlah Bersyarat

Meletakkan CASE dalam SUM membolehkan anda menjumlahkan nilai hanya apabila sesuatu syarat benar, dan menganggap baris yang tidak sepadan sebagai sifar. Ini ialah corak yang sangat lazim untuk laporan gaya pangsi yang memecahkan satu lajur kepada beberapa lajur metrik.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

AVG Bersyarat dengan CASE

Corak yang sama berfungsi dengan AVG. Oleh sebab AVG mengabaikan NULL, mengembalikan NULL bagi baris yang ingin dikecualikan akan menghasilkan purata hanya bagi baris yang sepadan — tanpa memerlukan subpertanyaan.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

Mengumpulkan dengan CASE — Mengkategorikan Baris

Anda boleh menggunakan CASE dalam senarai GROUP BY atau SELECT untuk mengkategorikan nilai berterusan, kemudian mengagregatkan setiap kategori. Ini menukar lajur berangka menjadi kumpulan berlabel tanpa mengubah data asas.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

Menggunakan Alias berbanding Mengulang CASE

Mengulang ungkapan CASE yang panjang dalam SELECT dan GROUP BY boleh menjadi berlebihan. Sesetengah pangkalan data (MySQL, PostgreSQL dengan kaedah tertentu) membolehkan anda merujuk alias dalam ORDER BY, tetapi bukan dalam GROUP BY. Pendekatan paling selamat dan serasi merentas pangkalan data ialah membungkus pertanyaan dalam subpertanyaan atau CTE, kemudian menggunakan GROUP BY pada alias dari situ.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

Menggabungkan ORDER BY CASE dengan ASC / DESC

Selepas ungkapan CASE, anda masih boleh menambah ASC atau DESC, serta menambah lajur isihan lain yang dipisahkan dengan koma. Skor CASE hanyalah kunci isihan pertama; lajur seterusnya menyelesaikan seri dengan cara biasa.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

Contoh Dunia Sebenar — Papan Pemuka Jualan

Berikut ialah kueri realistik yang menggabungkan agregat berasaskan CASE dengan isihan berasaskan CASE. Kueri ini menghasilkan ringkasan jualan mengikut wilayah yang disusun supaya wilayah dengan hasil tertinggi sentiasa muncul dahulu, manakala 'Lain-lain' diletakkan di bahagian bawah.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

Semakan Kefahaman

Uji pemahaman anda tentang penggunaan CASE dalam ORDER BY dan fungsi agregat.

Rumusan Pelajaran

Dalam pelajaran ini, anda telah mempelajari cara menggabungkan CASE dengan ORDER BY dan fungsi agregat:

  • CASE dalam ORDER BY — tetapkan skor isihan tersuai kepada baris, kawal tempat NULL muncul, dan gabungkan berbilang peraturan isihan dalam satu kueri.
  • CASE dalam COUNT — kembalikan nilai bukan NULL untuk baris yang perlu disertakan, dan NULL (secara tersirat atau nyata) untuk baris yang perlu dilangkau.
  • CASE dalam SUM / AVG — gunakan 0 atau NULL sebagai nilai ELSE untuk membina jumlah dan purata bersyarat dalam satu laluan.
  • CASE dalam GROUP BY — bahagikan nilai berterusan atau kategori kepada kumpulan berlabel untuk pengagregatan.

Corak ini menghapuskan keperluan untuk banyak subkueri dan menjadikan laporan gaya pangsi mudah ditulis dalam SQL biasa.

Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
46
Pelajaran
183

Soalan Lazim

Adakah pelajaran “CASE dalam ORDER BY dan Agregat” percuma?

Ya — teks penuh “CASE dalam ORDER BY dan Agregat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “CASE dalam ORDER BY dan Agregat”?

Pengisihan dan pengiraan bersyarat. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “CASE dalam ORDER BY dan Agregat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Ungkapan CASE
  2. CASE Carian berbanding CASE Ringkas
  3. Mengumpulkan dan Melabel Data
  4. CASE dalam ORDER BY dan Agregat
← Kembali ke SQL Academy