加入表格提供冗余数据

时间:2017-04-05 20:17:47

标签: sql sql-server

我在sql-server中有2个表,如下所示 -

emp_detail

 EID    ENAME     BHDT        SEXC  GRPT    MSTA    CITY
 2      Ana       5/10/1955   M     43000   M       Mexico
 5      Christina 4/20/1976   F     34000   S       Luea
 1      Maria     3/21/1952   F     55000   S       Berlin
 3      Antonio   10/15/1986  M     45630   U       Mexico
 7      RSTUV     1/14/1945   M     12672   S       New york
 6      Kristy    2/1/1967    F     23000   U       Texas
 4      Thomas    3/5/1962    M     43280   S       London

job_detail

EID Job_Type_Code   Job Val Code    EFDT
1   Plan            ESI             3/7/1950
1   LOC             20              4/20/1970
1   Plan            ESAL            3/9/1966
2   Plan            GARLND          12/15/1956
2   Union           15              11/6/1961
3   Plan            ESI             11/6/1986
3   LOC             15              11/6/1967
3   LOC             15              11/6/1986

我希望结果为 -

EID ENAME   BHDT       SEXC GRPT  MSTA CITY   plan_det loc_det Union_det Max_date
1   Maria   3/21/1952  F    55000 S    Berlin ESAL     20      (null)    4/20/1970
2   Ana     5/10/1955  M    43000 M    Mexico GARLND   (null)  15       12/15/1956
3   Antonio 10/15/1986 M    45630 U    Mexico ESI      15      (null)   11/6/1986

我尝试过以下查询,但没有成功 -

SELECT e.eid, e.ename, e.bhdt, e.sexc, e.grpt, e.msta, e.city, 
   case when j.JT_code = 'Plan' then JV_code end as plan_detail,
   case when j.JT_code = 'LOC' then JV_code end as loc_detail,
   case when j.JT_code = 'Union' then JV_code end as Union_detail,
   max(EFDT) latest_date
FROM emp_detail e inner join job_detail j 
on e.eid = j.eid
group by e.eid, e.ename, e.bhdt, e.sexc, e.grpt, e.msta, e.city, JT_code, JV_code

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你有一个EAV记录。您需要总结这些值。使用您的查询作为基础,group by是一种方便的方法:

SELECT e.eid, e.ename, e.bhdt, e.sexc, e.grpt, e.msta, e.city, 
       max(case when j.JT_code = 'Plan' then JV_code end) as plan_detail,
       max(case when j.JT_code = 'LOC' then JV_code end) as loc_detail,
       max(case when j.JT_code = 'Union' then JV_code end) as Union_detail,
       max(EFDT) as latest_date
FROM emp_detail e inner join
     job_detail j 
     on e.eid = j.eid
GROUP BY e.eid, e.ename, e.bhdt, e.sexc, e.grpt, e.msta, e.city;