使用COALESCE的连接值

时间:2013-01-25 10:38:54

标签: c# sql-server-2008

我有一张包含这些值的表格:

Empcode - Name - Skill - Primary
--------------------------------    
  1         X     .net    Yes
  1         X     c#  
  1         X     java   
  1         X     jsp
  2         Y     php     yes

我必须编写一个SQL查询,将数据显示为

EmpCode  Name   PrimarySkill SecondarySkill
---------------------------------------------
   1     X      .net         c#,Java,jsp
   2     Y      Php

请帮助生成此查询。我尝试过合并但是没有工作

4 个答案:

答案 0 :(得分:0)

SELECT 
    Empcode, Name, 
    GROUP_CONCAT(Skill) 
FROM <table_name> 
GROUP BY Empcode 
ORDER BY Primary DESC

答案 1 :(得分:0)

使用FOR XML PATH。在你的情况下,它将是这样的

SELECT  Empcode, Name, Skills
FROM   yourTable a
CROSS APPLY --or OUTER APPLY
(
    SELECT SUBSTRING(
        (SELECT ','+b.Skill FROM yourTable b
         WHERE   a.Empcode = b.Empcode FOR XML PATH(''))
    ,2 ,4000) Skills
) x

答案 2 :(得分:0)

递归CTE会帮助你做到这一点

-- First order all the secondary skills with a row number
with rows as (
    select 
        empcode, skill, row_number() over (partition by empcode order by skill) as row
    from dbo.table_1
    where [primary] is null and skill is not null
),
-- Second use recursive CTE to create concat the values
cte(empcode,skill,row) as (

    select empcode, cast(skill as varchar(MAX)), row
    from rows where row=1
    union all
    select r.empcode, cast(concat(c.skill, ',', r.skill) as varchar(MAX)), r.row
    from
    cte c inner join rows r on r.row = c.row + 1
),
-- Third sort the resulting CTE so that can filter to only the end of 
--the recursive chain
ordered(empcode,skill,row) as (
    select empcode,skill, row_number() over (Partition by empcode order by row desc)
    from cte
)

-- Now fetch the results
select
    t.empcode,t.name, t.skill as [primary skill], o.skill as [secondary skill]
from
table_1 t
left outer join ordered o on t.empcode=o.empcode and o.row=1
where t.[Primary] = 'Yes'

答案 3 :(得分:0)

试试这个,
SELECT distinct e.empcode, e.name ,
STUFF(( select ',' + t1.Skill from Employee t1
where t1.empcode = e.empcode and t1.name = e.name
for xml path('') ), 1, 1, '')' from Employee e