如何计算ID的出现次数,并使用SQL中其他表中具有此ID的项目名称显示此金额?

时间:2017-05-17 17:14:53

标签: sql

如果我有桌子

人:ID_Person,姓名

专业:ID_Prof,Prof_Name,ID_Person

如果ID_Person在第二个表格中多次出现,我想显示所有人物名称及其专业数量,我该怎么办?

我知道如果我想算一些我能写的东西 SELECT ID_Person,count(*)as c 来自职业 GROUP BY ID_Person; 但不知道如何将其与其他表中的列链接以获得正确的值。

5 个答案:

答案 0 :(得分:0)

要仅显示包含多个SecureRandom.random_number(9**6)的用户,那么您将6.times.map两个表格,并使用Professionjoin汇总并使用count()进行过滤:< / p>

group by

如果你想为这些人展示职业:

having()

答案 1 :(得分:0)

我相信你正在寻找这样的东西。左连接将引入所有数据,不会排除任何用户。 连接也可以是内连接。然后,内部联接将仅显示两个表中存在的用户。

<强> LEFT

select x.ID_Person, count(x.ID_Person) as [count] from table1  x
left join table2 y on y.ID_Person= x.ID_Person
where x.ID_Person <> null
group by x.ID_Person

<强> INNER

select x.ID_Person, count(y.ID_Person) from table1 x
inner join table2 y on y.ID_Person= x.ID_Person
group by x.ID_Person

答案 2 :(得分:0)

你可能会尝试下面这样的事情。但是,您必须考虑是否需要离开连接而不是内连接。如果可能有人没有任何职业,因此在职业表中不存在,您可能希望离开加入。

SELECT  pe.Name 
      , Professions = COUNT(pr.Prof_Name)

FROM    dbo.Person      (NOLOCK)     pe 
JOIN    dbo.Profession  (NOLOCK)     pr ON pe.ID_Person = pr.ID_Person

GROUP BY pe.Name

答案 3 :(得分:0)

最简单的解决方案可能是在子查询中计算:

select
  id_person,
  name,
  (select count(*) from profession pr where pr.id_person = p.id_person) as profession_count
from person p;

您可以通过外部联接实现相同的目标:

select
  p.id_person,
  p.name,
  coalesce(pr.cnt, 0) as profession_count
from person p
left join (select id_person, count(*) as cnt from profession group by id_person) pr
  on pr.id_person = p.id_person;

在加入之前聚合通常是一个好主意。无论如何,这是如何加入第一和聚合然后:

select
  p.id_person,
  p.name,
  coalesce(count(pr.id_person), 0) as profession_count
from person p
left join profession pr on pr.id_person = p.id_person
group by p.id_person, p.name;

按照标准SQL,按p.id_person进行分组就足够了,因为名称在功能上取决于id(即id唯一地定义了一个人,因此它是属于它的一个单一名称)。但是,某些DBMS并不完全符合此处的标准,并要求您将名称放在所示的group by子句中,或者在select子句中对其进行虚拟聚合(例如max(p.name))。

答案 4 :(得分:0)

这是一种方式(MySQL InnoDB)

Person
+-----------+-------+
| ID_Person | Name  |
+-----------+-------+
|         1 | bob   |
|         2 | alice |
+-----------+-------+

Profession
+---------+--------------------+-----------+
| ID_Prof | Prof_Name          | ID_Person |
+---------+--------------------+-----------+
|       1 | janitor            |         1 |
|       2 | cook               |         1 |
|       3 | computer scientist |         2 |
|       4 | home maker         |         2 |
|       7 | astronaut          |         2 |
+---------+--------------------+-----------+


select Name, count(Prof_Name) 
from Person left join Profession 
on (Person.ID_Person=Profession.ID_Person) 
group by Name;

+-------+------------------+
| Name  | count(Prof_Name) |
+-------+------------------+
| alice |                3 |
| bob   |                2 |
+-------+------------------+

希望这有帮助。