優化MySQL中CASE語句的使用
P粉463840170
P粉463840170 2023-09-04 18:42:48
0
2
474

大家好,

我有一個表格,如上面的螢幕截圖所示。我使用 CASE 語句編寫了一個查詢,以便它將傳回我需要的額外欄位。以下是我寫的查詢:

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;

這是我得到的結果表:

我想在這個查詢中實現的是,如果學生參加了該課程,它將在屬於該學生的所有行的班級列下顯示 1

例如,有student_id 2 的學生參加了1 班,因此在1 班>1 班,因此在1 班<1 班,因此在1 班<1 班,因此在1 班<1 班,因此在1 班< ;/code> 列下,student_id 2 的兩行都會顯示 1

我已經在查詢中實現了我想要的效果,但現在我不使用 1,而是希望它成為該類別的 enrollment_date。以下是我想要的最終輸出:

我可以知道應該如何修改查詢才能獲得上面螢幕截圖中的最終輸出嗎?

第二個問題:

如您在上面的查詢中所看到的,每個類別分別有一個 CASE 語句,以便為該類別建立列。但是,將來可能會有 5,6,7,... 類,因此每當存在不同的新類別時,我都需要再次添加額外的 CASE 語句。無論如何,我是否可以優化我的查詢,以便不需要為4 個不同的類別提供4 個CASE 語句,但仍然可以為不同的類別建立列(當有一個新類別時,將會有新的列)班級也是如此)?

範例資料

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') ;

P粉463840170
P粉463840170

全部回覆 (2)
P粉670107661

請參閱Pivot以了解預存程序,將根據資料表定義和資料產生並[可選]執行查詢。

    P粉785522400

    這是一個同時包含 class_end_date 和 enrollment_date 的範例 -

    SELECT student_id, GROUP_CONCAT(IF(class = 'class 1', enrollment_date, null)) 'Class 1 Enrolled', GROUP_CONCAT(IF(class = 'class 1', class_end_date, null)) 'Class 1 End', GROUP_CONCAT(IF(class = 'class 2', enrollment_date, null)) 'Class 2 Enrolled', GROUP_CONCAT(IF(class = 'class 2', class_end_date, null)) 'Class 2 End', GROUP_CONCAT(IF(class = 'class 3', enrollment_date, null)) 'Class 3 Enrolled', GROUP_CONCAT(IF(class = 'class 3', class_end_date, null)) 'Class 3 End', GROUP_CONCAT(IF(class = 'class 4', enrollment_date, null)) 'Class 4 Enrolled', GROUP_CONCAT(IF(class = 'class 4', class_end_date, null)) 'Class 4 End' FROM qa GROUP BY student_id;
      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!