Oracle SQL:使用 count() 和 group by() 将两个查询连接到一个结果集中
Oracle SQL: Join two queries into one result set using count() and group by()
- 我有两个 table 到 select 并从中加入数据。
- 两者共享相应的键值。
- 第二个 table 的 select 语句应 count() 和 group by() 值。
一个例子和预期结果说明情况:
Table一个
| id | rev | colour |
| --- | --- | ------ |
| 1 | a | blue |
| 2 | a | green |
| 1 | b | grey |
Table两个
| id | rev | note |
| --- | --- | -------- |
| 1 | a | rejected |
| 1 | a | removed |
| 1 | b | rejected |
| 1 | b | rejected |
| 2 | a | removed |
| 2 | a | removed |
预期结果集的伪SQL
t1.id、t1.rev、t1.colour、t2.count(拒绝)、t2.count(删除)
预期结果
| id | rev | colour | rejected | removed |
| --- | --- | ------ | -------- | ------- |
| 1 | a | blue | 1 | 1 |
| 2 | a | green | 0 | 2 |
| 1 | b | grey | 2 | 0 |
在一个 SQL 语句中获得此信息的最佳方法是什么?
我想我应该使用两个 sub-selects 并加入它们。不知道怎么办
放入 count()、group by() 并加入此处。
谢谢你的想法!
我认为您只需要聚合和 join
。我会这样处理:
select *
from table1 t1 left join
(select id, rev,
sum(case when note = 'rejected' then 1 else 0 end) as rejected,
sum(case when note = 'removed' then 1 else 0 end) as removed
from table2 t2
group by id, rev
) t2
using (id, rev);
在子查询中进行聚合并使用 using
子句可以方便地 select 来自 table1
的所有列,而不必列出所有列。
- 我有两个 table 到 select 并从中加入数据。
- 两者共享相应的键值。
- 第二个 table 的 select 语句应 count() 和 group by() 值。
一个例子和预期结果说明情况:
Table一个
| id | rev | colour |
| --- | --- | ------ |
| 1 | a | blue |
| 2 | a | green |
| 1 | b | grey |
Table两个
| id | rev | note |
| --- | --- | -------- |
| 1 | a | rejected |
| 1 | a | removed |
| 1 | b | rejected |
| 1 | b | rejected |
| 2 | a | removed |
| 2 | a | removed |
预期结果集的伪SQL
t1.id、t1.rev、t1.colour、t2.count(拒绝)、t2.count(删除)
预期结果
| id | rev | colour | rejected | removed |
| --- | --- | ------ | -------- | ------- |
| 1 | a | blue | 1 | 1 |
| 2 | a | green | 0 | 2 |
| 1 | b | grey | 2 | 0 |
在一个 SQL 语句中获得此信息的最佳方法是什么? 我想我应该使用两个 sub-selects 并加入它们。不知道怎么办 放入 count()、group by() 并加入此处。
谢谢你的想法!
我认为您只需要聚合和 join
。我会这样处理:
select *
from table1 t1 left join
(select id, rev,
sum(case when note = 'rejected' then 1 else 0 end) as rejected,
sum(case when note = 'removed' then 1 else 0 end) as removed
from table2 t2
group by id, rev
) t2
using (id, rev);
在子查询中进行聚合并使用 using
子句可以方便地 select 来自 table1
的所有列,而不必列出所有列。