【问题标题】:SQL Count for Each Category每个类别的 SQL 计数
【发布时间】:2016-06-13 02:47:36
【问题描述】:

我需要根据 2 个字段来计算行数以进行分组。

动物(一)

id     group_id   strain_id     death_date     death_cause   status
-----------------------------------------------------------------------
1      512        164           2015-12-01     Culled        P
2      512        164           2015-12-02     Culled        A
3      512        164           2015-12-02     Surplus       B
4      512        230           2015-12-06     Culled        A
5      512        164           2015-12-28     Culled        A
6      512        230           2016-01-20     Culled        B
7      512        230           2016-01-20     Surplus       P
8      512        164           NULL           NULL          P
9      512        230           NULL           NULL          B
10     512        230           NULL           NULL          A
11     512        164           2016-01-25     Culled        B
12     512        164           2016-02-29     Culled        A
13     512        230           2016-02-03     Surplus       P
14     512        230           2016-02-03     Culled        A

组 (g)

id     group_name
--------------
512    Mice

应变

id     strain_name
----------------
164    Strain 1
230    Strain 2

群体动物数量 (gac)

id     total_animals      alive_count       dead_count
----------------------------------------------------------------------
512    14                 3                 11

交配历史 (mh)

id     animal_id     history_type      history_date
--------------------------------------------------------
1001   2             MA                2015-11-20
1002   2             MR                2015-12-01
1003   3             MA                2015-12-01
1004   6             FA                2015-12-21
1005   9             FA                2016-02-07
1006   10            MA                2016-01-27
1007   11            FA                2015-12-12

因此,当我将它们按 strain_iddeath_cause 分组时,它们在视觉上应该是这样的:

菌株 1 ---- 剔除

1      512        164           2015-12-01     Culled        P
2      512        164           2015-12-02     Culled        A
5      512        164           2015-12-28     Culled        A
11     512        164           2016-01-25     Culled        B
12     512        164           2016-02-29     Culled        A

应变 1 ---- 剩余

3      512        164           2015-12-02     Surplus       B

菌株 2 ---- 剔除

4      512        230           2015-12-06     Culled        A
6      512        230           2016-01-20     Culled        B
14     512        230           2016-02-03     Culled        A

应变 2 ---- 剩余

7      512        230           2016-01-20     Surplus       P
13     512        230           2016-02-03     Surplus       P

我想从 SQL 查询中得到以下结果:

g_name  s_name    d_cause  a_total  c_alive  c_dead  c_pup  c_breeder  c_total
------------------------------------------------------------------------------
Mice    Strain 1  Culled   12       3        9       1      2          5
Mice    Strain 1  Surplus  12       3        9       0      1          1
Mice    Strain 2  Culled   12       3        9       0      1          3
Mice    Strain 2  Surplus  12       3        9       2      0          2

基本上我想使用 2 个类别来计算动物的数量,在这种情况下是 strain_namedeath_cause

请注意,对于要算作饲养员 (c_breeder) 的动物,我必须查看交配历史表并检查 animal_id 是否曾有任何这些代码 MAFA .

我在groupsgroup_animal_countstrains 上使用INNER JOIN。我将LEFT JOIN 用于mating_history,因为状态为P 的动物在该表中不会有记录,因为它们只是幼崽,不会参与交配。

【问题讨论】:

  • 这是您使用的 exact 查询,还是涉及到一些 LEFT JOIN
  • @GiorgosBetsos 有 3 个INNER JOINs 和 1 个LEFT JOIN
  • 你必须给我们一些额外的信息。您面临的问题无法通过提供的表结构、示例数据和查询重现。
  • 好的,给我几分钟,我会尝试重做这个问题。
  • 你不能只按 group_name、strain_name、death_cause 分组(使用内部连接来连接表)然后计算 death_dates 吗?

标签: sql oracle count group-by


【解决方案1】:

试试:

SELECT group_name, strain_name,death_cause, count(*) as Total
FROM ANIMALS a
JOIN GROUPS g ON a.group_id = g.id
JOIN STRAIN s ON a.strain_id = s.id
GROUP BY group_name, strain_name,death_cause

【讨论】:

  • 您的解决方案和@maraca 似乎给出了相同的结果。我明天必须验证它。我正要离开办公室。感谢您的意见!
  • @SaravanakumarVadivel 我再次更新了问题以尽可能详细。该解决方案确实有效,但我最初的问题并未包括我在查询中所做的所有joins。我添加所有内容的那一刻,数字不匹配。请再看一遍。希望我更新的问题能显示我想要实现的目标。
【解决方案2】:

您可以在加入表格之前进行聚合:

SELECT group_name, strain_name, death_cause, total
FROM   (
         SELECT   group_id,
                  strain_id,
                  death_cause,
                  COUNT(*) AS total
         FROM     animals
         GROUP BY group_id, strain_id, death_cause
       ) a
       INNER JOIN groups g ON ( g.group_id = a.group_id )
       INNER JOIN strain s ON ( s.strain_id = a.strain_id );

【讨论】:

  • 感谢您的意见。我试过了,它似乎可以工作,但是当我添加 LEFT JOIN 时,数字不再加起来了。我将问题更新为尽可能详细,因此请再次查看。希望你能帮帮我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2021-03-23
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2017-06-21
  • 2022-01-23
相关资源
最近更新 更多