【问题标题】:How Can I get Pivot Type Data using T-Sql如何使用 T-Sql 获取枢轴类型数据
【发布时间】:2014-09-10 03:31:44
【问题描述】:

我有需要显示前 3 名薪水员工的要求。它得到了显示前 3 名员工姓名的查询,如下所示:

select top 3 [Employee First Name]+' '+[Employee Surname] as [Employee Full Name]  
from [Emp ]
group by [Employee First Name],[Employee Surname],[Annual Salary]
order by sum([Annual Salary]) desc

结果:

[EmpFullName]
---------------
Darren Ben
Sam nixon
Frances Oliv

但我想要这样的结果:

[FirstEmp]    [SecondEmp]   [ThirdEmp]
-------------------------------------------
Darren Ben    Sam nixon     Frances Oliv

我想要硬编码的列和名称。

感谢您的建议...

【问题讨论】:

  • 签出transpose
  • 表中有不同的员工吗?如果是这样,那您为什么需要通过sum([Annual Salary]) 订购?
  • @bluefeet,感谢您的回复。是的,您的权利不需要总和([年薪])。我刚刚更改了我的查询,它只是“按 [Annual Salary] desc 排序”。

标签: sql sql-server sql-server-2008 tsql sql-server-2012


【解决方案1】:

我发现这个解决方案有效,但不一定是最好的。 它基于将 row_number 列添加到您的查询,然后使用 COALESCE(MAX( 选择您的 3 列。 (见SQL Server : Transpose rows to columns) 在我看来,在这种情况下比使用 t-sql PIVOT 更好。

SELECT 
COALESCE(MAX(CASE WHEN x = 1 THEN [Employee Full Name] END), 'n/a') as FirstEmp,
COALESCE(MAX(CASE WHEN x = 2 THEN [Employee Full Name] END), 'n/a') as SecondEmp,
COALESCE(MAX(CASE WHEN x = 3 THEN [Employee Full Name] END), 'n/a') as ThirdEmp
FROM (
    select top 3 
    row_number() over(order by [Annual Salary] desc) x,
    [Employee First Name]+' '+[Employee Surname] as [Employee Full Name]
    from Emp
    group by [Employee First Name],[Employee Surname],[Annual Salary]
    order by [Annual Salary] desc
    ) empRanks

我已将 order by sum([Annual Salary]) desc 替换为 order by [Annual Salary] desc,因为内部 SELECT 已按 [Annual Salary] 分组。


我用来填充数据来测试它的脚本:

DECLARE @emp TABLE
(
  [Employee First Name] varchar(50) NULL,
  [Employee Surname] varchar(50) NULL,
  [Annual Salary] int NULL
)

INSERT INTO @emp VALUES ('Darren','Ben',500)
INSERT INTO @emp VALUES ('Sam','nixon',600)
INSERT INTO @emp VALUES ('Frances','Oliv',700)
INSERT INTO @emp VALUES ('AAFrances','AAAOliv',200)
INSERT INTO @emp VALUES ('AAFrancsasaes','AAAOsasaliv',2000)

【讨论】:

  • 目不转睛,这不会返回 3 行每列填充一列而不是单行填充 3 列吗?
  • @billinkc 它返回一行 3 列,如果您想自己检查,我可以发布整个脚本。
  • VDohnal,感谢您的回复。我得到了您的代码的答案,非常感谢。你能告诉我我能从数据透视表中得到相同的答案吗
  • @user3583912 你的意思是使用 t-sql PIVOT 关系运算符?请参阅@vasja 答案,我看不出有什么问题,我相信它得到 -1 只是因为它是纯代码答案。
  • 感谢您的回复。是的,出于某种原因,我想在 PIVOT 中使用它。 @vasja 代码工作正常。谢谢
【解决方案2】:

也许有人可以简化一下:

create table #Emp (EmpId integer identity, [Employee First Name] varchar(30), [Employee Surname]  varchar(30), [Annual Salary] decimal)

insert into #Emp ([Employee First Name], [Employee Surname], [Annual Salary] )
values 
('Darren', 'Ben', 100000),
('Sam', 'Nixon', 80000),
('Frances', 'Oliv', 70000)


select * from (
select 
case (_order)
when 1 then 'FirstEmp'
when 2 then 'SecondEmp'
when 3 then 'ThirdEmp'
end as col
, q.name
from (
    select top 3 ROW_NUMBER() OVER ( ORDER BY [Annual Salary]  desc) as _order, [Employee First Name]+' '+[Employee Surname] as name
    from [#Emp ]
    group by EmpId, [Employee First Name],[Employee Surname],[Annual Salary]
    order by 1
) as q
) as o
pivot 
(
min(name)
for col in (FirstEmp, SecondEmp, ThirdEmp)
) as p 

使用ROW_NUMBER() OVER ... 计算顺序,然后使用PIVOT 将行转置为列。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2012-09-23
    • 2013-10-15
    • 2021-08-26
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多