如何使用pivot加入两个表,并在1个表中组合两个字段

时间:2016-04-27 18:55:48

标签: sql database pivot rdbms unpivot

我有这种格式的两张表

Job_Skill

     ID_Skill  Min_Job  Idea_Job   Max_Job
     =====================================
         1        0           0       1
         2        0           1       1
         7        1           1       1
         8        1           1       1

Job_Education

        Degree_Job  Field_Job  Min_Job   Idea_Job   Max_Job
        ===================================================
              7        37         0         0         1
              7        106        0         1         1
              13       37         1         1         1
              13       106        1         1         1

我想像这样显示

  Criteria   1  2  7  8 [ 7  37 ] [ 7 106 ]  [13 37]   [13 106]
  =============================================================
  Min        0  0  1  1    1         1         0          0   
  Ideal      0  1  1  1    0         1         1          1
  Max        1  1  1  1    1         1         1          1 

我如何在枢轴中实现这一目标。如果您有任何其他方法,请建议。

2 个答案:

答案 0 :(得分:0)

declare @job_skill table (id_skill int,min_job int ,ideal_job int ,max_job int)
insert into @job_skill
VAlues
(         1 ,       0 ,          0 ,      1),
(         2 ,       0 ,          1 ,      1),
(         7 ,       1 ,          1 ,      1),
(         8 ,       1 ,          1 ,      1)


declare @Job_Education table (Degree_Job int,  Field_Job int,  Min_Job int,   Ideal_Job int,  Max_Job int)
insert into @job_education
values
(              7 ,       37  ,       0 ,        0 ,        1),
(              7  ,      106 ,       0 ,        1 ,        1),
(              13 ,      37  ,       1 ,        1 ,        1),
(              13 ,      106 ,       1 ,        1 ,        1)

/*
I want to display like this

  Criteria   1  2  7  8 [ 7  37 ] [ 7 106 ]  [13 37]   [13 106]
  =============================================================
  Min        0  0  1  1    1         1         0          0   
  Ideal      0  1  1  1    0         1         1          1
  Max        1  1  1  1    1         1         1          1 
*/

select *
from
(
select 1 as seq,'Min' as Criteria,cast(id_skill as char(10)) as COL, min_job jobval
from   @job_skill
union  
select 2,'Ideal',cast(id_skill as char(10)) as criteria,ideal_job 
from   @job_skill
union  
select 3,'Max',cast(id_skill as char(10)) as criteria, Max_job
from   @job_skill
union  
select 1, 'Min','(' + rtrim(cast(degree_job as char(4))) +  ' ' + rtrim(cast(field_job as char(4))) +')'  , min_job 
from    @job_education
union  
select 2, 'Ideal','(' + rtrim(cast(degree_job as char(4))) +  ' ' + rtrim(cast(field_job as char(4))) +')'  , ideal_job
from    @job_education
union  
select 3, 'Max','(' + rtrim(cast(degree_job as char(4))) +  ' ' + rtrim(cast(field_job as char(4))) +')'   , Max_job
from    @job_education
) s
pivot  (max(jobval) for col in([1],[2],[7],[8],[(7 37)],[(7 106)],[(13 37)],[(13 106)])) pvt
order by seq

答案 1 :(得分:0)

这就是答案。我有想要的结果。查询是动态的。

   Declare @Skill  NVARCHAR(MAX),
        @Degree_Field  NVARCHAR(MAX),
        @Experience  NVARCHAR(MAX),
        @query  NVARCHAR(MAX)


    select @Skill = 
                STUFF((
                        select SEQ
                        From
                        (
                            SELECT  SEQ = (',' + QUOTENAME(Skill_Name) )
                            From
                            (
                            select Skill_Meta.Skill_Name,Min_Job, Ideal_Job, Max_Job
                            FROM Job_Skill
                            Inner Join Skill_Meta On Skill_Meta.ID_SKL = Job_Skill.ID_SKL_Job
                            )SKL

                            UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U
                        ) SKL

                        GROUP By SEQ 
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)') 
                        ,1,1,'') 

    select @Degree_Field = 
                STUFF((
                        select SEQ
                        From
                        (
                            SELECT  SEQ = (',' + QUOTENAME(cast(CONCAT(Degree_Job,' ', Field_Job) as varchar(10))) )
                            FROM Job_Education
                            UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U
                        ) SKL

                        GROUP By SEQ 
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)') 
                        ,1,1,'') 
   select @Experience = 
                STUFF((
                        select SEQ
                        From
                        (
                            SELECT  SEQ = (',' + QUOTENAME(cast(Experience_Job as varchar(10))) )
                            FROM Job_Experience
                            UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U
                        ) SKL

                        GROUP By SEQ 
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)') 
                        ,1,1,'')

    set @query = 
            ';With
            P1_Src As
            (
                SELECT ID_Job,Skill_Name, Val, Col
                FROM Job_Skill
                Inner Join Skill_Meta On Skill_Meta.ID_SKL = Job_Skill.ID_SKL_JOB
                UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U

            ), 
            P1 AS
            (
                SELECT ID_Job,Col,'+@Skill+'
                FROM P1_Src
                PIVOT (MAX(Val) FOR Skill_Name IN ('+@Skill+')) AS Pa
            ),

            P2_Src As
            (
                SELECT ID_Job,CONCAT(Degree_Job,'' '', Field_Job) as DegreeField, Val, Col
                FROM Job_Education
                UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U
            ),

            P2 AS
            (
               SELECT ID_Job,Col,'+@Degree_Field+'
               FROM P2_Src
               PIVOT (MAX(Val) FOR DegreeField IN ('+@Degree_Field+')) AS Pb
            ),

            P3_Src As
            (
                SELECT ID_Job,Experience_Job, Val, Col
                FROM Job_Experience
                UNPIVOT (Val FOR Col IN (Min_Job, Ideal_Job, Max_Job)) AS U
            ),

            P3 AS
            (
               SELECT ID_Job,Col,'+@Experience+'
               FROM P3_Src
               PIVOT (MAX(Val) FOR Experience_Job IN ('+@Experience+')) AS Pc
            )



            select P1.ID_Job,P1.Col,P1.'+@Skill+',P2.'+@Degree_Field+',P3.'+@Experience+' 
            From P1
            Inner Join P2 On P1.ID_Job = P2.ID_Job and P1.Col = P2.Col
            Inner Join P3 On P1.ID_Job = P3.ID_Job and P1.Col = P3.Col'

exec sp_executesql @query