Sql server 请帮助解决此SQL Server问题
请帮助解决此SQL Server问题。我有一个表employee以及下面列出的字段(请参见粗体的employee表)。我希望得到如下所示的结果(请参见粗体显示的结果) 员工表:Sql server 请帮助解决此SQL Server问题,sql-server,Sql Server,请帮助解决此SQL Server问题。我有一个表employee以及下面列出的字段(请参见粗体的employee表)。我希望得到如下所示的结果(请参见粗体显示的结果) 员工表: Name Age Salary Employee Type Employed Date Name Age Salary Employee_Type Date_Hired Employee 1 24 24,000.00 Staff January 15, 2
Name
Age
Salary
Employee Type
Employed Date
Name Age Salary Employee_Type Date_Hired
Employee 1 24 24,000.00 Staff January 15, 2009
Employee 2 33 32,000.00 Staff February 1, 2005
Employee 3 23 75,000.00 Consultant March 20, 2002
Employee 1 Employee 2 Employee 3
Age 24 33 23
Salary 24,000.00 32,000.00 75,000.00
Employee_Type Staff Staff Consultant
Date_Hired January 15, 2009 February 1, 2005 March 20, 2002
员工数据:
Name
Age
Salary
Employee Type
Employed Date
Name Age Salary Employee_Type Date_Hired
Employee 1 24 24,000.00 Staff January 15, 2009
Employee 2 33 32,000.00 Staff February 1, 2005
Employee 3 23 75,000.00 Consultant March 20, 2002
Employee 1 Employee 2 Employee 3
Age 24 33 23
Salary 24,000.00 32,000.00 75,000.00
Employee_Type Staff Staff Consultant
Date_Hired January 15, 2009 February 1, 2005 March 20, 2002
结果:
Name
Age
Salary
Employee Type
Employed Date
Name Age Salary Employee_Type Date_Hired
Employee 1 24 24,000.00 Staff January 15, 2009
Employee 2 33 32,000.00 Staff February 1, 2005
Employee 3 23 75,000.00 Consultant March 20, 2002
Employee 1 Employee 2 Employee 3
Age 24 33 23
Salary 24,000.00 32,000.00 75,000.00
Employee_Type Staff Staff Consultant
Date_Hired January 15, 2009 February 1, 2005 March 20, 2002
多亏了阿尔比·巴格达尼亚:)这里有一种方法。UNPIVOT用于将列名转移到行,然后使用该列名(现在是行)的标准分组来为每个员工透视名称/值组合。请注意,使用unpivot时,列应具有相同的数据类型,这就是为什么会出现cast和convert。这种方法唯一的缺点是员工姓名是硬编码的,但除非使用动态数据透视,否则这总是一个问题。然而,由于您提到您只有大约10名员工需要corsstab,所以这应该不是问题。以下是脚本:
select
unp.ColumnName,
max(case when Name = 'Employee 1' then Value else null end) [Employee 1],
max(case when Name = 'Employee 2' then Value else null end) [Employee 2],
max(case when Name = 'Employee 3' then Value else null end) [Employee 3]
from
(
select
Name, cast(Age as varchar(20)) Age,
cast(Salary as varchar(20)) Salary,
cast(Employee_Type as varchar(20)) Employee_Type,
convert(varchar(20), Employed_Date, 106) Employed_Date
from dbo.Employee
) src
unpivot
(
Value for ColumnName in (
[Age], [Salary], [Employee_Type], [Employed_Date])
) unp
group by unp.ColumnName;
-- the above produces something like this for
-- the data consistent with the sample in question:
ColumnName Employee 1 Employee 2 Employee 3
-------------------- -------------------- -------------------- -----------
Age 24 33 23
Employed_Date 15 Jan 2009 01 Feb 2005 20 Mar 2002
Employee_Type Staff Staff Consultant
Salary 24000.00 32000.00 75000.00
多亏了奥列格。:)
另一个动态解决方案升级了Oleg的解决方案这是可以做到的,但当您添加员工时,您会添加列,如果没有动态SQL,SQL就不能满足这一要求。就个人而言,我会在报表、客户机代码或Access/Excel pivotsgbn中这样做——这只是一个示例。员工不需要数百条记录。它最多只有10条记录。在这个问题上,我将原来的表格替换为Employee,以便有一个清晰的视角@Ocaso Protal-如果我把它放在这里,你会解决它吗?我试着提出这个问题只是为了得到一些想法或其他方法来解决这个问题。我不是一个枢轴专家,所以我可能不会回答你的问题。但经验表明,当你发布到目前为止尝试过的内容时,你会得到答案。也许您的代码中只有一个小错误。好的,谢谢。所以继续关注这个问题,也许有人会回答这个问题。或者,一旦我解决了问题,我会在这里发布我的答案。任何其他解决方案都将受到高度赞赏。:)