優化MySQL中CASE語句的使用
P粉463840170
2023-09-04 18:42:48
<p>大家好,</p>
<p>我有一個表格,如上面的螢幕截圖所示。我使用 <code>CASE</code> 語句編寫了一個查詢,以便它將傳回我需要的額外欄位。以下是我寫的查詢:</p>
<pre class="brush:php;toolbar:false;">SELECT
*,
CASE WHEN (SUM(CASE WHEN class = 'class 1' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 1',
CASE WHEN (SUM(CASE WHEN class = 'class 2' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 2',
CASE WHEN (SUM(CASE WHEN class = 'class 3' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 3',
CASE WHEN (SUM(CASE WHEN class = 'class 4' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0 END AS 'Class 4'
FROM qa;</pre>
<p>這是我得到的結果表:</p>
<p>我想在這個查詢中實現的是,如果學生參加了該課程,它將在屬於該學生的所有行的班級列下顯示 <code>1</code>。 </p>
<p>例如,有<code>student_id</code> <code>2</code> 的學生參加了<code>1 班</code>,因此在<code>1 班>1 班</code>,因此在<code>1 班<1 班</code>,因此在<code>1 班<1 班</code>,因此在<code>1 班<1 班</code>,因此在<code>1 班< ;/code> 列下,<code>student_id</code> <code>2</code> 的兩行都會顯示<code> 1</code>。 </p>
<p>我已經在查詢中實現了我想要的效果,但現在我不使用 <code>1</code>,而是希望它成為該類別的 <code>enrollment_date</code>。以下是我想要的最終輸出:</p>
<p>我可以知道應該如何修改查詢才能獲得上面螢幕截圖中的最終輸出嗎? </p>
<p><strong>第二個問題:</strong></p>
<p>如您在上面的查詢中所看到的,每個類別分別有一個 <code>CASE</code> 語句,以便為該類別建立列。但是,將來可能會有 5,6,7,... 類,因此每當存在不同的新類別時,我都需要再次添加額外的 <code>CASE</code> 語句。無論如何,我是否可以優化我的查詢,以便不需要為4 個不同的類別提供4 個<code>CASE</code> 語句,但仍然可以為不同的類別建立列(當有一個新類別時,將會有新的列)班級也是如此)? </p>
<h2>範例資料</h2>
<pre class="brush:php;toolbar:false;">create table qa(
student_id INT,
class varchar(20),
class_end_date date,
enrollment_date date
);
insert into qa (student_id, class, class_end_date, enrollment_date)
values
(1, 'class 1', '2022-03-03', '2022-02-14'),
(1, 'class 3', '2022-06-13', '2022-04-12'),
(1, 'class 4', '2022-07-03', '2022-06-19'),
(2, 'class 1', '2023-03-03', '2022-07-14'),
(2, 'class 2', '2022-08-03', '2022-07-17'),
(4, 'class 4', '2023-03-03', '2022-012-14'),
(4, 'class 2', '2022-04-03', '2022-03-21')
;</pre></p>
請參閱Pivot以了解預存程序,將根據資料表定義和資料產生並[可選]執行查詢。
這是一個同時包含 class_end_date 和 enrollment_date 的範例 -