2016-12-13 28 views
2

我有表所示:如何避免空行數據轉換爲列數據在mysql中值

emp_number | leave_status | leave_length_days | leave_type_id | 
+------------+--------------+-------------------+---------------+ 
|  775 |   3 |    1.00 | 001   | 
|  775 |   1 |    1.00 | 001   | 
|  775 |   1 |    1.00 | 001   | 
|  775 |   3 |    1.00 | 001   | 
|  775 |   3 |    0.50 | 001   | 
|  775 |   1 |    1.00 | 001   | 
|  775 |   1 |    1.00 | 001   | 
|  775 |   2 |    1.00 | 001   | 
|  775 |   11 |    1.00 | 001   | 
|  775 |   11 |    1.00 | 001   | 
|  775 |   2 |    1.00 | 001   | 
|  775 |   2 |    1.00 | 001   | 
|  776 |   1 |    1.00 | 001   | 
|  776 |   1 |    1.00 | 001   | 
|  776 |   4 |    0.00 | 001   | 
|  776 |   4 |    0.00 | 001   | 
|  776 |   1 |    1.00 | 001   | 
|  776 |   1 |    1.00 | 001   

我希望輸出這樣的:

+------------+---------------+---------+----------+ 
| emp_number | leave_type_id | pending | approved | 
+------------+---------------+---------+----------+ 
|  775 | 001   | 4.00 |  8.00 | 
|  776 | 001   | 4.00 |  NULL | 

我曾嘗試以下查詢:

select emp_number 
    , leave_type_id 
    , (CASE WHEN leave_status=1 THEN sum(leave_length_days) END) pending 
    , (CASE WHEN leave_status=2 THEN sum(leave_length_days) END) approved 
    from em_leave 
where emp_number in (775,776) 
group 
    by emp_number 
    , leave_status 
    , leave_type_id; 

但它給我輸出像:

+------------+---------------+---------+----------+ 
| emp_number | leave_type_id | pending | approved | 
+------------+---------------+---------+----------+ 
|  775 | 001   | 4.00 |  NULL | 
|  775 | 001   | NULL |  8.00 | 
|  775 | 001   | NULL |  NULL | 
|  775 | 001   | NULL |  NULL | 
|  776 | 001   | 4.00 |  NULL | 
|  776 | 001   | NULL |  NULL | 
+------------+---------------+---------+----------+ 

我不想NULL值。請幫助我。

回答

4

GROUP BY刪除leave_status,將SUM()出方的CASE EXPRESSION

select emp_number 
    , leave_type_id 
    , SUM(CASE WHEN leave_status=1 THEN leave_length_days ELSE 0 END) pending 
    , SUM(CASE WHEN leave_status=2 THEN leave_length_days ELSE 0 END) approved 
    from em_leave 
where emp_number in (775,776) 
group by emp_number 
     , leave_type_id; 

我假設你使用MySQL,因爲它是允許這種的sh * t時的唯一DBMS。

+0

謝謝,它的工作很好。 :) – Madhura