繁体   English   中英

sql连接多个表,以将行作为列返回

[英]sql join multiple tables, to return rows as columns

抱歉,如果已经在某个地方回答了该问题,我已经进行了搜索,但找不到答案。

我有3个SQL表:员工表(ID,名称等...)关键技能表(ID,技能名称)链接表(员工ID,技能ID)

员工显然可以具有多种关键技能,但是我试图将它们作为“员工报告”报告为一行,如下所示:

第2行-名称,小球,关键技能1,关键技能2,等等...第2行-名称,小球,关键技能1,关键技能2,等等...

我可以使用以下方法获得返回为多行的技能:

SELECT DISTINCT kst.KeySkillName FROM KeySkillsTable
    INNER JOIN KeySkillsLinkTable kslt ON kslt.EmployeeId = 2
    INNER JOIN KeySkillsTable kst ON kst.Id = kslt.KeySkillsId

但是当我将其作为子查询放入较大的选择中时,出现以下错误:

子查询返回的值超过1。 当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

我认为这是因为子查询返回多行,而不是我需要的多列。

任何人都可以提供的任何帮助将不胜感激,在此先感谢您。

您可以使用PIVOT执行这种类型的转换。 有两种方法,一种是静态透视表,您在其中对列的值进行硬编码;另一种是动态透视表,其中在运行时确定了列。 这是一个如何根据您的情况执行此操作的示例。

静态数据透视表(请参阅带有演示的SQL Fiddle

select *
from 
(
  select e.id, e.name, s.skillname, count(*) cnt
  from employee e
  left join emp_skill es
    on e.id = es.emp_id
  left join skills s
    on es.skill_id = s.id
  group by e.id, e.name, s.skillname
) x
pivot
(
  sum(cnt)
  for skillname in([skill 1], [skill 2], [skill 3])
) p

Dynamic Pivot(请参阅带有演示的SQL Fiddle

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(skillname) 
                    from skills
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
      = 'SELECT id, name,' + @cols + ' from 
         (
            select e.id, e.name, s.skillname, count(*) cnt
            from employee e
            left join emp_skill es
              on e.id = es.emp_id
            left join skills s
              on es.skill_id = s.id
            group by e.id, e.name, s.skillname
         ) x
         pivot 
         (
            sum(cnt)
            for skillname in(' + @cols + ')
         ) p '

execute(@query)

这两个查询将产生相同的结果。 区别在于,首先必须对要成为列的所有值进行编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM