员工数据的第一个表
|ids| name |
+=============+
|1 | Ibrahim |
|2 | Rizky |
|3 | David |
第二个上班的人
|id| ids | date |
+========+============+
|1 | 1 | 2018-05-01 |
|2 | 2 | 2018-05-01 |
|3 | 3 | 2018-05-01 |
|4 | 1 | 2018-05-02 |
|5 | 3 | 2018-05-02 |
|6 | 1 | 2018-05-03 |
|6 | 2 | 2018-05-03 |
|7 | 1 | 2018-05-04 |
|8 | 2 | 2018-05-04 |
|9 | 3 | 2018-05-04 |
我想要的结果,或多或少像这样
|name | 2018-05-01 | 2018-05-02 | 2018-05-03 | 2018-05-04 |
=========+============+============+==-=========+============+
|Ibrahim | 1 | 1 | 1 | 1 |
|Rizky | 1 | | 1 | 1 |
|David | 1 | 1 | | 1 |
你能帮助我吗,我想显示这样的数据,下面的日期写的是部分例子,我希望从第一个月到月底整整一个月。 1表示此人上班,空表示不上班。
你可以帮我解决一下这个问题,如何查询它的连接以及如何在它的外观中显示迭代?
答案 0 :(得分:1)
可能有一种奇特的方式,但我会这样做like this
select
e.name,
if(sum(if(w.date = '2018-05-01',1,0))=0,null,1) as '2018-05-01',
if(sum(if(w.date = '2018-05-02',1,0))=0,null,1) as '2018-05-02',
if(sum(if(w.date = '2018-05-03',1,0))=0,null,1) as '2018-05-03',
if(sum(if(w.date = '2018-05-04',1,0))=0,null,1) as '2018-05-04',
if(sum(if(w.date = '2018-05-05',1,0))=0,null,1) as '2018-05-05',
if(sum(if(w.date = '2018-05-06',1,0))=0,null,1) as '2018-05-06',
if(sum(if(w.date = '2018-05-07',1,0))=0,null,1) as '2018-05-07'
from employee e
left join work w ON e.ids = w.ids
group by e.ids
我对员工ID进行分组,并使用总和(如果(确定他们当天是否有效)。
这是动态方法 -
SET @s := (SELECT GROUP_CONCAT(DISTINCT CONCAT('if(sum(if(w.date = "',
date,
'",1,0))=0,null,1) AS `',
date,'`'
)
) from work);
SET @s := concat('select e.name, ',@s,' from employee e
left join work w ON e.ids = w.ids
group by e.ids');
PREPARE stmt FROM @s;
EXECUTE stmt;
有关动态方法available here的更多信息。