使用sql中的查询在一行中显示多行?

时间:2014-09-25 08:58:44

标签: sql sql-server

我想显示部门号码。以及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

3 个答案:

答案 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

SQLFiddle

答案 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