MySQL 查询结果分成多行

在进行数据库查询时,我们经常需要将查询结果按照一定的规则分成多行显示。MySQL 提供了多种方法来实现这一需求,本文将介绍其中的一些常用方法,并提供代码示例。

1. 使用 CASE 语句

CASE 语句是一种条件表达式,可以根据不同的条件返回不同的值。在查询结果中使用 CASE 语句,可以将结果分成多行显示。

假设我们有一个名为 employees 的表,其中包含员工的姓名、职位和部门信息。我们希望将每个员工的职位分成多行显示。

SELECT
  employee_name,
  CASE
    WHEN position = 'Manager' THEN 'Manager'
    WHEN position = 'Developer' THEN 'Developer'
    ELSE 'Other'
  END AS position1,
  CASE
    WHEN position = 'Manager' THEN NULL
    WHEN position = 'Developer' THEN NULL
    ELSE position
  END AS position2
FROM employees;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

2. 使用 PIVOT 函数

PIVOT 函数可以将行数据转换为列数据,从而实现将查询结果分成多行显示。这种方法适用于需要将多个值显示在同一行中的情况。

假设我们有一个名为 sales 的表,其中包含产品名称和销售额。我们希望将每个产品的销售数据分成多行显示。

SELECT
  product_name,
  [2021] AS sales_2021,
  [2022] AS sales_2022
FROM
  (SELECT product_name, year, sales FROM sales) AS source
PIVOT
  (SUM(sales) FOR year IN ([2021], [2022])) AS pivot_table;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

3. 使用 UNIONUNION ALL

UNIONUNION ALL 可以将多个查询结果合并为一个结果集。通过合理地使用这两个操作符,我们可以将查询结果分成多行显示。

假设我们有一个名为 orders 的表,其中包含订单信息。我们希望将每个订单的详细信息分成多行显示。

SELECT
  order_id,
  'Order Date' AS detail,
  order_date
FROM orders
UNION ALL
SELECT
  order_id,
  'Product Name' AS detail,
  product_name
FROM orders
UNION ALL
SELECT
  order_id,
  'Quantity' AS detail,
  quantity
FROM orders;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

4. 使用 GROUP_CONCAT

GROUP_CONCAT 函数可以将多个行的值连接成一个字符串。通过使用这个函数,我们可以将查询结果分成多行显示。

假设我们有一个名为 order_details 的表,其中包含订单的详细信息。我们希望将每个订单的详细信息分成多行显示。

SELECT
  order_id,
  GROUP_CONCAT(detail SEPARATOR '; ') AS details
FROM
  (SELECT order_id, 'Order Date: ' || order_date AS detail FROM orders
   UNION ALL
   SELECT order_id, 'Product Name: ' || product_name AS detail FROM order_details
   UNION ALL
   SELECT order_id, 'Quantity: ' || quantity AS detail FROM order_details) AS details
GROUP BY order_id;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

5. 使用存储过程

存储过程是一种在数据库中存储的 SQL 代码集合。通过编写存储过程,我们可以更灵活地控制查询结果的显示方式。

假设我们有一个名为 employees 的表,其中包含员工的姓名、职位和部门信息。我们希望将每个员工的职位分成多行显示。

DELIMITER //
CREATE PROCEDURE DisplayEmployeePositions()
BEGIN
  SELECT employee_name, position FROM employees;
  SELECT employee_name, department FROM employees;
END //
DELIMITER ;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

项目计划

以下是将查询结果分成多行显示的项目计划甘特图:

gantt
  title 项目计划
  dateFormat  YYYY-MM-DD
  section 设计
  设计阶段1 :done, des1, 2023-01-01,2023-01-07
  设计阶段2 :active, des2, 2023-01-08,2023-01-14
  section 实现
  实现阶段1 :des3, after des2, 2023-01-15,2023-01-21
  实现阶段2 :des4, after des3, 2023-01-22,2023-01-28
  section 测试
  测试阶段1 :after des4, t1, 2023-01-29,2023-02-04
  测试阶段2 :t2, after t1, 2023-02-05