我的数据库中有三个表。
这是结构
我无法想到一个会以下列格式返回结果的查询
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
答案 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;