mysql - 如何在mysql中选择每列的前3个值

标签 mysql sql select

您好,我有一张这样的表格,其中包含当天人员的类次。我需要按类次对它进行分类

+------------+----------+-----------------+
| shift_date | name     | shift           |
+------------+----------+-----------------+
| 2016-07-01 | Swamy    | Morning Shift   |
| 2016-07-01 | Hitesh   | Morning Shift   |
| 2016-07-01 | Naresh   | Afternoon Shift |
| 2016-07-01 | Rambabu  | Afternoon Shift |
| 2016-07-01 | Srinivas | Night Shift     |
| 2016-07-01 | Ahmed    | Night Shift     |
| 2016-07-01 | Naveen   | Week Off        |
| 2016-07-01 | Karthik  | Week Off        |
+------------+----------+-----------------+ 

我需要一个查询来获得结果

+------------+---------+-----------+----------+---------+
| shift_date | Morning | Afternoon | Night    | WeekOff |
+------------+---------+-----------+----------+---------+
| 2016-07-01 | Swamy   | Naresh    | Srinivas | Naveen  |
| 2016-07-01 | Hitesh  | Rambabu   | Ahmed    | Karthik |
+------------+---------+-----------+----------+---------+

我写了这个查询

 select
     shift_date,
     CASE shift
       WHEN shift <>'Morning Shift'
       then name
     end as Morning,
     CASE shift
       WHEN shift<>'Afternoon Shift'
       then name
     end as Afternoon,
     CASE shift
       WHEN shift<>'Night Shift'
       then name
     end as Night,
     CASE shift
       WHEN shift<>'Week Off'
       then name
     end as WeekOff
 from roster
 where shift_date ='2016-7-1'
 order by morning desc ,afternoon desc, night desc ,weekoff desc; 

但它得到的结果是

+------------+---------+-----------+----------+---------+
| shift_date | Morning | Afternoon | Night    | WeekOff |
+------------+---------+-----------+----------+---------+
| 2016-07-01 | Swamy   | NULL      | NULL     | NULL    |
| 2016-07-01 | Hitesh  | NULL      | NULL     | NULL    |
| 2016-07-01 | NULL    | Rambabu   | NULL     | NULL    |
| 2016-07-01 | NULL    | Naresh    | NULL     | NULL    |
| 2016-07-01 | NULL    | NULL      | Srinivas | NULL    |
| 2016-07-01 | NULL    | NULL      | Ahmed    | NULL    |
| 2016-07-01 | NULL    | NULL      | NULL     | Naveen  |
| 2016-07-01 | NULL    | NULL      | NULL     | Karthik |
+------------+---------+-----------+----------+---------+

我需要结果作为

+------------+---------+-----------+----------+---------+
| shift_date | Morning | Afternoon | Night    | WeekOff |
+------------+---------+-----------+----------+---------+
| 2016-07-01 | Swamy   | Naresh    | Srinivas | Naveen  |
| 2016-07-01 | Hitesh  | Rambabu   | Ahmed    | Karthik |
+------------+---------+-----------+----------+---------+

最佳答案

select m.shift_date  ,Morning , Afternoon 
from (select shift_date,name as Morning  from roster where shift = 'Morning Shift') as m, 
LEFT JOIN (select shift_date,name as Afternoon  from roster where shift = 'Afternoon Shift') as n on m.shift_date = n.shift_date

在您的问题中,所有轮类日期都相同。 因此,通过这个加入日期也将获得 shift_date 的名称。

这不是一个合适的解决方案。 希望能有点帮助

关于mysql - 如何在mysql中选择每列的前3个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38432790/

相关文章:

javascript - Flask:基于先前选择的下拉值

SQL Server while 循环联合所有

php - MySQL 表连接、嵌套 select 语句或创建 View ?

mysql - 子查询在 group by 子句中返回多于 1 行 - MySQL

php - Mysql 选择哪里 id = ? AND url = 1、0 或全部

sql - Powershell:将一个下拉框中的选择用作另一个变量

mysql - 选择每个类别中聚合度最高的名称

Mysql group post_id 按最大计数状态

PHP - 单击按钮时使用 for 循环将 Form Div 递增 1

mysql - 使用 knex 和 bookshelf 创建数据库和模式的语法?