Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql中的数据透视_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

我有sql表,数据如下所示

    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吗?当然,我将把它作为练习留给你。另外,我对PIVOT
PIVOT
也不是很熟悉。它是有效的,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