2016-05-13 70 views
0

我需要查询从两个表中获取记录,但列名应该基于第二个表中的记录。 详细信息如下如何从两个表中获取记录根据第二个表行记录指定列名称

我的第一台

Emp Table 
emp_id  emp_name 
    1   Abc 
    2   XYZ 
    3   PQR 

我的第二个表

Salary Table 
id emp_id month salary 
1  1  1  4000 
2  1  2  3000 
3  2  1  5000 
4  2  2  4500 

我需要输出一样,

emp_id emp_name  jan feb 
    1   Abc  4000 3000 
    2   XYZ  5000 4500 

我能够用左连接来实现这一但对于每个月我需要添加它在查询,如

select e.emp_id,e.emp_name,j.month as Jan,f.month as Feb from emp e 
Left Join salary j on e.emp_id=j.emp_id and j.month=1  
Left Join salary f on e.emp_id=f.emp_id and f.month=2 

上面的工作对我来说但这是不可行的。我也有一个月的主表。

Month Table 
id  Name 
1  Jan 
2  Feb 
3  March 
5  April 

我想取为当前特定月份记录(一月& 2月)。

请帮我实现这个更快的方式。

+0

能否请您发布主表的一个月? –

回答

1

使用条件汇总:

SELECT 
    e.emp_id, 
    e.emp_name, 
    [Jan] = MAX(CASE WHEN s.[month] = 1 THEN s.salary END), 
    [Feb] = MAX(CASE WHEN s.[month] = 2 THEN s.salary END), 
    [Mar] = MAX(CASE WHEN s.[month] = 3 THEN s.salary END), 
    [Apr] = MAX(CASE WHEN s.[month] = 4 THEN s.salary END), 
    [May] = MAX(CASE WHEN s.[month] = 5 THEN s.salary END), 
    [Jun] = MAX(CASE WHEN s.[month] = 6 THEN s.salary END), 
    [Jul] = MAX(CASE WHEN s.[month] = 7 THEN s.salary END), 
    [Aug] = MAX(CASE WHEN s.[month] = 8 THEN s.salary END), 
    [Sep] = MAX(CASE WHEN s.[month] = 9 THEN s.salary END), 
    [Oct] = MAX(CASE WHEN s.[month] = 10 THEN s.salary END), 
    [Nov] = MAX(CASE WHEN s.[month] = 11 THEN s.salary END), 
    [Dec] = MAX(CASE WHEN s.[month] = 12 THEN s.salary END) 
FROM Emp e 
LEFT JOIN Salary s 
    ON s.emp_id = e.emp_id 
GROUP BY 
    e.emp_id, e.emp_name 

ONLINE DEMO

+0

嗨菲利克斯,感谢您的快速反应。 我有一个问题:如果工资是字符串($ 4000),我应该使用哪个聚合函数呢?如果我删除了最大值,它会给出错误。 –

+0

使用'MAX'即可。 –

+0

如果我想用空格替换Null? –

相关问题