多个 GROUP 和 COUNT Oracle SQL

Posted

技术标签:

【中文标题】多个 GROUP 和 COUNT Oracle SQL【英文标题】:Multiple GROUP and COUNT Oracle SQL 【发布时间】:2018-05-16 16:03:25 【问题描述】:

我有一个 Oracle 11g 数据库,其中包含两个表,我需要从中提取、分组和计数数据。表中的数据为:

Table 'ED'
|NAME | SSN       | IDG   | IDE | IDD | SPOUSE | CHILD |
========================================================
|John | 111111111 | 12345 | 123 | 0   | FALSE  | FALSE |
|Sue  | 111221111 | 12345 | 123 | 1   | TRUE   | FALSE |
|Joe  | 111331111 | 12345 | 123 | 2   | FALSE  | TRUE  |
|Sam  | 111441111 | 12345 | 321 | 0   | FALSE  | TRUE  |
|Jane | 111551111 | 12345 | 321 | 1   | TRUE   | FALSE |
|Jim  | 111661111 | 12345 | 555 | 0   | FALSE  | TRUE  |
|Zach | 111771111 | 12345 | 555 | 2   | FALSE  | TRUE  |

Table 'EL'
|IDG   | IDE | IDD | FLAG01 | FLAG02 | FLAG03 | FLAG04 |
========================================================
|12345 | 123 | 0   | TRUE   | FALSE  | TRUE   | TRUE   |
|12345 | 123 | 1   | TRUE   | FALSE  | FALSE  | FALSE  |
|12345 | 123 | 2   | TRUE   | TRUE   | TRUE   | TRUE   |
|12345 | 321 | 0   | TRUE   | FALSE  | TRUE   | TRUE   |
|12345 | 321 | 1   | TRUE   | FALSE  | FALSE  | FALSE  |
|12345 | 555 | 0   | TRUE   | FALSE  | TRUE   | TRUE   |
|12345 | 555 | 1   | TRUE   | FALSE  | FALSE  | FALSE  |

所以前三个人是一个家庭,父亲、配偶和孩子。我需要在 IDG=12345 和 IDE=123 下将它们都算作一个“家庭”组。接下来的2个人是一对夫妻,夫妻。我需要将它们归为“一对”。最后两个人是父亲和孩子,所以他们需要被归为“爸爸-孩子”。下一个分组是对上述每个分组的计数,其中 FLAG01=T,然后是单独的计数,其中 FLAG02 为真,FLAG03 为真,FLAG04 为真。所以期望的输出是:

FLAG01=T:
Family: 3
Couple: 2
Dad-Child: 2

FLAG02=T:
Family: 1
Couple: 0
Dad-Child: 0

FLAG03=T:
Family: 2
Couple: 1
Dad-Child: 1

FLAG04=T:
Family: 2
Couple: 1
Dad-Child: 1

我知道 IDG 和 IDE 字段的两个表必须有一个连接,但我不确定如何按“家庭”、“夫妻”、“爸爸-孩子”类别进行分组,然后计算数字基于标志是真还是假。感谢您的任何帮助!

【问题讨论】:

您想要的输出不太合理。你能把它放在一个表格格式,有明确定义的列吗?根据您的解释,我期待三行。 【参考方案1】:

当然,如果我正确理解您的问题,这应该可以解决问题

SELECT COUNT(EL.FLAG01), COUNT(EL.FLAG02), COUNT(EL.FLAG03), COUNT(EL.FLAG04), ED.IDE 
FROM ED
INNER JOIN EL on ED.IDE=EL.IDE
GROUP BY ED.IDE

【讨论】:

不幸的是,这并没有按家庭/夫妻/爸爸-孩子类别对他们进行分组。确定分组的唯一方法是基于将 SPOUSE/CHILD 标志设置为 true。所以 IDE 是 IDG 编号/分组中的唯一编号,但我需要一种方法来计算它们是否应该分组为家庭/夫妻/爸爸-孩子。【参考方案2】:

查看您的数据并根据您的解释,您可以使用一些聚合函数检索您需要的值 (假设 TRUE 和 FALSE 是字符串,否则 .. 删除查询中的引号)

select IDG
  , IDE
  , count(*)
  , case when max(spouse) = 'TRUE' AND max(child) = 'FALSE' then 'Couple'
         when max(spouse) = 'TRUE' AND max(child) = 'TRUE' then 'Family'
         when max(spouse) = 'FALSE' AND max(child) = 'TRUE' AND count(*)>1 then dad-child
         END type_of_ralation
FROM ED
group by IDG , IDE

【讨论】:

以上是关于多个 GROUP 和 COUNT Oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 中使用 GROUP BY 和 HAVING COUNT(condition) 的 SQL 查询

mongo中的高级查询之聚合操作(distinct,count,group)与数据去重

oracle查询选择语句——count、sum、order by、group by

如何在 JOIN MySQL 中进行 GROUP BY 和 COUNT(*)

SQL多次分组问题 group by

Oracle之Group by和Having-----转了