sql中的数据透视
我有sql表,数据如下所示sql中的数据透视,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有sql表,数据如下所示 emp id empname dept ------- ---- ------ 1 a Hr 2 b Hr 3 c Tech 4 d Hr 5 e Admin 7 f
emp id empname dept
------- ---- ------
1 a Hr
2 b Hr
3 c Tech
4 d Hr
5 e Admin
7 f Tech
8 g Admin
现在,我想旋转上面的表,得到这样的结果
Hr Tech Admin
----- ----- -----
Empname a c e
Empname b f g
Empname d
我只是想知道在sql中使用数据透视是否有可能实现这一点,或者是否有其他方法来实现这一点这种类型的操作通常最好在表示层完成。看起来您希望列中有三个不同的列表,因此这些行实际上并不相互关联 也就是说,您可以在SQL中执行此操作,但需要为每个列获取一个“列表位置”。为此,请使用
行编号()
:
您可以将条件聚合与
行数一起使用
:
以下是透视图的版本:
为什么
d
不包括在列表中?@FelixPamittan i Forgott它工作起来很神奇,但是可以使用pivot吗?当然,我将把它作为练习留给你。另外,我对PIVOTPIVOT
也不是很熟悉。它是有效的,Felix Pamittan的查询也是有效的,但是使用pivot@abhi . . . 实际上我更喜欢费利克斯的答案。但我留下这个,以防它会帮助任何其他可能在这个问题上绊倒的人。
select h.empname as hr, t.empname as tech, a.empname as admin
from (select empname, row_number() over (order by empname) as seqnum
from table
where dept = 'Hr'
) h full outer join
(select empname, row_number() over (order by empname) as seqnum
from table
where dept = 'Tech'
) t
on t.seqnum = h.seqnum full outer join
(select empname, row_number() over (order by empname) as seqnum
from table
where dept = 'Admin'
) a
on a.seqnum in (h.seqnum, t.seqnum)
WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY dept ORDER BY empid)
FROM tbl
)
SELECT
[Hr] = MAX(CASE WHEN dept = 'Hr' THEN empname END),
[Tech] = MAX(CASE WHEN dept = 'Tech' THEN empname END),
[Admin] = MAX(CASE WHEN dept = 'Admin' THEN empname END)
FROM cte
GROUP BY rn
;WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY dept ORDER BY empid)
FROM tbl
)
SELECT *
FROM(
SELECT
dept, MAX(empname) AS empname,RN
FROM Cte
GROUP BY dept, RN
)t
PIVOT
(
MAX(empname)
FOR dept in ([Hr], [Tech], [Admin])
)piv