多个GROUP和COUNT个Oracle SQL

时间:2018-05-16 16:03:25

标签: sql oracle

我有一个带有两个表的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下的“家庭”组。接下来的两个人是夫妻,丈夫和妻子。我需要将它们分组为“情侣”。最后两个人是父亲和孩子,所以他们需要归为“爸爸孩子”。下一个分组是上述每个分组的计数,其中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字段的两个表必须连接,但我不确定如何按“家庭”,“情侣”,“爸爸孩子”类别进行分组,然后计算数字基于标志是真还是假。我感谢任何和所有的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

向您查找数据并根据您的解释,您可以使用某些聚合函数检索所需的值 (假设为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