SQL查询 - 一对多

时间:2014-05-03 13:43:09

标签: sql-server

我的数据库中有三个表。

  1. 员工
  2. 技能
  3. EmployeeSkill
  4. 这是结构

    enter image description here

    我无法想到一个会以下列格式返回结果的查询

    Employee    [Skill1]    [Skill2]    [Skill3]  ...
    
    Mr.Abc      true         false       true
    
    Mr.Xyz      false        true        true
    

    其中[Skill1],[Skill2]等将列出技能表中定义的特定类别的所有技能,列值(true / false)将取决于EmployeeSkill表中的记录。例如,如果表中有一个条目将Employee与[skill1]相关联,则会列出true,如果没有条目,则列出false。

    此外,所选技能的数量(以及显示为列标题)可以根据skillCategory进行更改。

    帮助appriciated

1 个答案:

答案 0 :(得分:0)

使用SQL PIVOT功能

http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

来自该网站的示例:

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
   FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;

另请参阅此答案以获得有关pivot的一个体面示例: How to create a pivot query in sql server without aggregate function

更新:我为你创建了一个SQL小提琴,展示了如何做到这一点。唯一的问题是,使用PIVOT,您无法使列动态化。有一种方法可以让它变得动态,但只能使用动态查询......(这里有一个示例说明:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx - >评论'Como hacer PIVOT conconsultasdinámicas')。

这是我为你做的SQL小提琴:http://sqlfiddle.com/#!3/cb979/5/1

假设这个基本代码:

CREATE TABLE EMPLOYEES
    (
    Id int NOT NULL IDENTITY (1, 1),
    FirstName varchar(50) NULL,
    LastName varchar(50) NULL,
    Salary float(53) NULL,
    Department varchar(50) NULL
    )  ON [PRIMARY]

CREATE TABLE Skill
    (
    Id int NOT NULL IDENTITY (1, 1),
    Skill varchar(50) NULL,
    )  ON [PRIMARY]

CREATE TABLE EmployeeSkill
    (
    SkillId int,
    EmployeeId varchar(50) NULL,
    ) 

INSERT INTO EMPLOYEES (FirstName, LastName, Salary, Department) 
  VALUES ('Alex','T',200,'IT');
INSERT INTO EMPLOYEES (FirstName, LastName, Salary, Department) 
  VALUES ('Zed','Bee',300,'IT');

INSERT INTO Skill (Skill) VALUES ('SQL Skill');
INSERT INTO Skill (Skill) VALUES ('HTML Skill');
INSERT INTO Skill (Skill) VALUES ('PHP Skill');

INSERT INTO EmployeeSkill (SkillID, EmployeeID) VALUES(1,1);
INSERT INTO EmployeeSkill (SkillID, EmployeeID) VALUES(2,1);
INSERT INTO EmployeeSkill (SkillID, EmployeeID) VALUES(3,1);
INSERT INTO EmployeeSkill (SkillID, EmployeeID) VALUES(1,2);

这个SQL创建了pivot:

SELECT *
FROM
(
SELECT EmployeeID, FirstName + ' ' + LastName as FullName, SkillID, Skill
FROM EmployeeSkill LEFT JOIN Skill ON Skill.ID = SkillID
  LEFT JOIN Employees ON Employees.ID = EmployeeID
) AS source
PIVOT
(
    COUNT([SkillID])
    FOR [Skill] IN ([SQL Skill], [HTML Skill], [PHP Skill])
) as pvt;