我在下面的查询中有一个问题

时间:2015-06-11 11:27:00

标签: sql-server-2008

员工表:

ID Name Date   Active Salary
1   A   1/04     1     2000
2   B   1/04     0     2000
3   C   3/05     1     4000
4   A   5/05     1     4000
5   B   16/05    1     9000
6   A   2/05     1     3000
7   D   3/08     0    12000

所需输出#1:这是每个名字所有记录的总和和数。

Name Count Salary
A      3    9000
B      2   11000
C      1    4000
D      1   12000

所需输出#2:这是所有记录的总和,但每个名称只有活动记录的数量。

Name Count Salary
A      3    9000
B      1   11000
C      1    4000
D      0   12000

1 个答案:

答案 0 :(得分:2)

这里提供了一些一般性建议,足以引导您找到解决方案而无需为您完成所有工作。

现在我想我应该假设你知道这一点,但是,如果你是完整的初学者,你可以从表格中选择某些类似的列(可能在任何订单):

sql> select name, salary from employees
A   2000
B   2000
C   4000
A   4000
B   9000
A   3000
D  12000

您还可以使用where子句过滤数据中的某些行,例如仅获得工资为4000或更低的那些行(同样,不保证订单):

sql> select name, salary from employees
...> where salary <= 4000
A   2000
B   2000
C   4000
A   4000
A   3000

您可以根据常用条件将行组合在一起,例如获取最早的&#34;每个可能的工资值的名称,但也包括组成该组的每一行的计数(例如,2000工资有两行,9000有一行):

sql> select min(name), count(*), salary from employees
...> group by salary
A   2    2000
A   2    4000
A   1    3000
B   1    9000
D   1   12000

您只需要获得所需的结果,您只需要以稍微不同的方式应用这些知识:

  • 您只需要选择表格中的namesalary信息,您就没有兴趣展示日期或有效旗帜;
  • 您需要分组 name计数行的每一行;和
  • 你对工资的总和感兴趣,而不是名字的最小值。

这应该足以让你继续,只要你意识到我没有在上面加粗这些词,因为我喜欢玩不同的字体属性: - )

由于现在已经过了足够的时间来判断这是否属于课堂作业,请参阅以下架构设置和查询以提供您想要的内容:

create table empl (
  id     integer,
  name   varchar(20),
  dt     date,
  actv   integer,
  sal    integer);
insert into empl(id,name,dt,actv,sal) values (1,'A','4/01/2015',1, 2000);
insert into empl(id,name,dt,actv,sal) values (2,'B','4/01/2015',0, 2000);
insert into empl(id,name,dt,actv,sal) values (3,'C','5/03/2015',1, 4000);
insert into empl(id,name,dt,actv,sal) values (4,'A','5/05/2015',1, 4000);
insert into empl(id,name,dt,actv,sal) values (5,'B','5/16/2015',1, 9000);
insert into empl(id,name,dt,actv,sal) values (6,'A','5/02/2015',1, 3000);
insert into empl(id,name,dt,actv,sal) values (7,'D','8/03/2015',0,12000);

select     name,
           count(1) as count,
           sum(sal) as salary
from       empl
group by   name

根据需要提供:

name  count  salary
----  -----  ------
A         3    9000
B         2   11000
C         1    4000
D         1   12000

这涵盖了你的第一个案例。你的第二种情况有点棘手,因为你希望每个名字的所有工资总和,但你只想计算活动记录。这可以通过自加入子查询来完成:

select   e1.name, 
         (select count(1)
          from   empl e2
          where  e2.name = e1.name
            and  e2.actv = 1) as count,
         sum(e1.sal) as salary
from     empl e1
group by name

通过这个稍微修改过的查询,您得到:

name  count  salary
----  -----  ------
A         3    9000
B         1   11000
C         1    4000
D         0   12000