天天看點

MySQL 傳回未包含在group by中的列

備注:測試資料庫版本為MySQL 8.0

如需要scott使用者下建表及錄入資料語句,可參考:

​​scott建表及錄入資料sql腳本​​

一.需求

正在執行一個group by查詢,并希望傳回哪些屬于選擇清單而不包含于group by子句的列。

通常,這是不可能的,因為對于這樣的非組列,并不時每行都包含唯一值。

假設要找到每個部門中工資最高和最低的員工,以及每種職位中工資最高和最低的員工,要檢視這些人的姓名、所在部門、職位名稱以及工資。

希望傳回的結果集如下:

±-------±-------±----------±--------±----------------±---------------+

| deptno | ename | job | sal | dept_status | job_status |

| 20 | SCOTT | ANALYST | 3000.00 | TOP SAL IN DEPT | TOP SAL IN JOB |

| 20 | FORD | ANALYST | 3000.00 | TOP SAL IN DEPT | TOP SAL IN JOB |

| 10 | MILLER | CLERK | 1300.00 | LOW SAL IN DEPT | TOP SAL IN JOB |

| 20 | SMITH | CLERK | 800.00 | LOW SAL IN DEPT | LOW SAL IN JOB |

| 30 | JAMES | CLERK | 950.00 | LOW SAL IN DEPT | NULL |

| 10 | CLARK | MANAGER | 2450.00 | NULL | LOW SAL IN JOB |

| 20 | JONES | MANAGER | 2975.00 | NULL | TOP SAL IN JOB |

| 30 | BLAKE | MANAGER | 2850.00 | TOP SAL IN DEPT | NULL |

| 10 | KING | PRESIDENT | 5000.00 | TOP SAL IN DEPT | TOP SAL IN JOB |

| 30 | ALLEN | SALESMAN | 1600.00 | NULL | TOP SAL IN JOB |

| 30 | WARD | SALESMAN | 1250.00 | NULL | LOW SAL IN JOB |

| 30 | MARTIN | SALESMAN | 1250.00 | NULL | LOW SAL IN JOB |

二.解決方案

使用内斂視圖,按deptno和job找到最高工資和最低工資。然後,隻保留工資最高或工資最低的員工。

測試記錄:

MySQL 傳回未包含在group by中的列