我想显示部门号码。以及EMP
表中每个部门中的员工数量。我有一个查询,它将结果显示在不同的行中。
select deptno, count(*) from emp
group by deptno;
Dptno Count(*)
10 5
20 3
30 4
我想将结果显示为单行。例如:
Dpt10 Count(*) Dpt20 Count(*) Dpt30 Count(*)
10 5 20 3 30 4
这个论坛的输出不合适,但试着理解不行。 5,3& 4应低于count(*)
列和10,20& 30应低于deptno
。
答案 0 :(得分:0)
由于pivot不支持SQL Server中的多个聚合:
with t as (
select 10 id, 15 su union all
select 10 id, 10 su union all
select 10 id, 5 su union all
select 20 id, 135 su union all
select 20 id, 100 su union all
select 20 id, 15 su union all
select 30 id, 150 su union all
select 30 id, 1000 su union all
select 30 id, 500 su
)
select max(case when id = 10 then id end) dept10
, count(case when id = 10 then id end) dept10_cnt
, max(case when id = 20 then id end) dept20
, count(case when id = 20 then id end) dept20_cnt
, max(case when id = 30 then id end) dept30
, count(case when id = 30 then id end) dept30_cnt
from t
答案 1 :(得分:0)
在SQL Server中,有几种方法可以将多行数据转换为列。
如果您只需要将每个count
的{{1}}转换为列,那么您可以使用PIVOT函数或CASE /聚合组合轻松完成此操作
deptno
请参阅Demo
但问题的一部分是你想要将select
sum(case when deptno = 10 then 1 else 0 end) Count_Dpt10,
sum(case when deptno = 20 then 1 else 0 end) Count_Dpt20,
sum(case when deptno = 30 then 1 else 0 end) DCount_pt30
from emp
和DeptNo
都转移到列中 - 这需要使用2个不同的聚合函数。在您的情况下,PIVOT功能不起作用,因此您必须使用不同的聚合函数以及类似于的CASE表达式:
Total_Count
见SQL Fiddle with Demo。既然你有不知名的部门,那么你需要使用动态的sql。这将创建一个sql字符串,然后执行。要创建sql字符串,您需要使用select
max(case when deptno = 10 then deptno end) Dpt10,
sum(case when deptno = 10 then 1 else 0 end) Count_Dpt10,
max(case when deptno = 20 then deptno end) Dpt20,
sum(case when deptno = 20 then 1 else 0 end) Count_Dpt20,
max(case when deptno = 30 then deptno end) Dpt30,
sum(case when deptno = 30 then 1 else 0 end) DCount_pt30
from emp;
和STUFF
。动态代码为:
FOR XML PATH
见SQL Fiddle with Demo。这给你一个结果:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols
= STUFF((SELECT
', max(case when deptno = '+cast(deptno as varchar(10))+' then deptno end) as '+ QUOTENAME('Dpt'+cast(deptno as varchar(10)))
+ ', sum(case when deptno = '+cast(deptno as varchar(10))+' then 1 else 0 end) as '+ QUOTENAME('Count_Dpt'+cast(deptno as varchar(10)))
from emp
group by deptno
order by deptno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT ' + @cols + '
from emp'
exec sp_executesql @query;
答案 2 :(得分:-2)
你可以试试这个 -
<强>模式强>
DECLARE @emp TABLE ([deptno] int NULL, [deptcount] int NULL);
INSERT @emp ([deptno], [deptcount]) VALUES (10, 5), (20, 3), (30, 4);
<强>查询强>
SELECT STUFF((
SELECT ' ' + CAST([deptno] AS VARCHAR) + ' ' + CAST([deptcount] AS VARCHAR)
FROM @emp
FOR XML PATH('')
), 1, 1, '')
<强>输出强>
10 5 20 3 30 4