在MSSQL中,在不同列但在同一行中显示同一表中的数据
我要一张桌子 我想做的是选择如下数据在MSSQL中,在不同列但在同一行中显示同一表中的数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我要一张桌子 我想做的是选择如下数据 OUTPUT{ID,FirstName,LastName,SkillONE,SkillOneExp,SkillTwo,SkillTwoExp,SkillThree,SkillThreeExp} 在这里,SkillOne将展示最有经验的技能(如java、C++),SkillOneExp是该技能的经验年,等等。将只显示3个这样的。每个员工只有一行 我试着 select e.ID ,e.FirstName ,e.LastName ,es.experience
OUTPUT{ID,FirstName,LastName,SkillONE,SkillOneExp,SkillTwo,SkillTwoExp,SkillThree,SkillThreeExp}
在这里,SkillOne将展示最有经验的技能(如java、C++),SkillOneExp是该技能的经验年,等等。将只显示3个这样的。每个员工只有一行
我试着
select
e.ID
,e.FirstName
,e.LastName
,es.experience
,CAST
(
CASE
WHEN tf.rownumber = 1
THEN tf.skill_description
END
AS varchar(50)
)as SKILLONE
,CAST
(
CASE
WHEN tf.rownumber = 1
THEN tf.experience
END
AS varchar(50)
)as SKILLONE_EXP
,CAST
(
CASE
WHEN tf.rownumber = 2
THEN tf.skill_description
END
AS varchar(50)
)as SKILTWO
,CAST
(
CASE
WHEN tf.rownumber = 2
THEN tf.experience
END
AS varchar(50)
)as SKILLTWO_EXP
from
Employee e
JOIN
EmployeeSkill es
on es.ID=e.ID
JOIN
skills s
on s.skill_ID=es.skill_ID
JOIN
(
select * from
(
(select
ROW_NUMBER() OVER (ORDER BY es2.experience ASC) AS rownumber,
es2.ID
,es2.skill_ID
,es2.experience
,s2.skill_description
from
EmployeeSkill es2
JOIN
skills s2
on
s2.skill_ID=es2.skill_ID
)
) as tf2
)as tf
on tf.id= e.id
通过使用这个,我没有得到正确的结果。我正在使用MS SQL 2012。通过编辑@anon的查询,我解决了我的问题。非常感谢他
SELECT
emp.ID,
emp.FirstName,
emp.LastName,
MIN(CASE i WHEN 1 THEN ski.skill_description END) AS SkillOne ,
MIN(CASE i WHEN 1 THEN ski.experience END) AS SkillOneExp ,
MIN(CASE i WHEN 2 THEN ski.skill_description END) AS SkillTwo ,
MIN(CASE i WHEN 2 THEN ski.experience END) AS SkillTwoExp ,
MIN(CASE i WHEN 3 THEN ski.skill_description END) AS SkillThree ,
MIN(CASE i WHEN 3 THEN ski.experience END) AS SkillThreeExp
FROM
Employee AS emp
CROSS APPLY (
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY experience DESC) i,
CAST(skill_description AS varchar(50),
CAST(experience AS varchar(50)
FROM EmployeeSkill t1
INNER JOIN skills t2
ON (t1.skill_ID = t2.skill_ID)
ORDER BY experience DESC
) AS ski
GROUP BY
emp.ID,
emp.FirstName,
emp.LastName
SELECT
emp.ID,
emp.FirstName,
emp.LastName,
MIN(CASE i WHEN 1 THEN ski.skill_description END) AS SkillOne ,
MIN(CASE i WHEN 1 THEN ski.experience END) AS SkillOneExp ,
MIN(CASE i WHEN 2 THEN ski.skill_description END) AS SkillTwo ,
MIN(CASE i WHEN 2 THEN ski.experience END) AS SkillTwoExp ,
MIN(CASE i WHEN 3 THEN ski.skill_description END) AS SkillThree ,
MIN(CASE i WHEN 3 THEN ski.experience END) AS SkillThreeExp
FROM
Employee AS emp
CROSS APPLY (
SELECT TOP 3
ROW_NUMBER() OVER(ORDER BY experience DESC) i,
CAST(skill_description AS varchar(50) ) AS skill_description,
CAST(experience AS varchar(50) ) AS experience
FROM EmployeeSkill t1
INNER JOIN skills t2
ON (t1.skill_ID = t2.skill_ID) AND t1.ID=emp.ID
ORDER BY experience DESC
) AS ski
GROUP BY
emp.ID,
emp.FirstName,
emp.LastName
为什么不在客户端应用程序中执行此旋转?假设它必须循环遍历数据,让它在显示时决定是将下一个值放在同一行还是下一行将更加有效…您可以使用sql server pivot:Thank@AaronBertrandThank@BrettSchneider我要尝试这种方法非常感谢anon的查询,很抱歉,此查询有错误(在强制转换后需要“)”),无法正常工作,但我从您的查询中得到了解决此问题的方法