问题描述
- 我有两个表可供选择和联接。
- 两者共享相应的键值。
- 第二个表的select语句应为count()和by()值分组。
一个例子和预期结果将说明这种情况:
表一
| id | rev | colour |
| --- | --- | ------ |
| 1 | a | blue |
| 2 | a | green |
| 1 | b | grey |
表二
| 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语句中获得此最佳方法是什么? 我想我应该使用两个子选择并将其合并。不知道怎么 放入count(),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
子句可以方便地从table1
中选择所有列,而不必列出所有列。