-1

抱歉,如果这已在某处得到回答,我已经搜索但找不到答案。

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

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

第 1 行 - 姓名、出生日期、关键技能 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 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

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

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

4

1 回答 1

4

您可以使用PIVOT. 有两种方法,一种是对列的值进行硬编码的静态透视,另一种是在运行时确定列的动态透视。这是一个示例,说明如何针对您的情况执行此操作。

静态数据透视(参见SQL Fiddle with Demo

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 with Demo

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)

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

于 2012-08-19T23:51:43.617 回答