簡體   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