Sql 从一个表中选择列并从另一个表中选择计数
期望输出:Sql 从一个表中选择列并从另一个表中选择计数,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,期望输出: t1 id | name | include ------------------- 1 | foo | true 2 | bar | true 3 | bum | false t2 id | some | table_1_id ------------------------- 1 | 42 | 1 2 | 43 | 1 3 | 42 | 2 4 | 44 | 1 5 | 44 | 3
t1
id | name | include
-------------------
1 | foo | true
2 | bar | true
3 | bum | false
t2
id | some | table_1_id
-------------------------
1 | 42 | 1
2 | 43 | 1
3 | 42 | 2
4 | 44 | 1
5 | 44 | 3
我目前从其他解决方案中了解到:
name | count(some)
------------------
foo | 3
bar | 1
但这似乎让我明白了
SELECT a.name,
COUNT(r.some)
FROM t1 a
JOIN t2 r on a.id=r.table_1_id
WHERE a.include = 'true'
GROUP BY a.id,
r.some;
我不是sql专家(我可以做简单的查询),所以我也在谷歌上搜索,但找到的大多数解决方案都会给我这个结果。我可能遗漏了一些非常简单的内容。只需从
group by
子句中删除第二列即可
name | count(r.some)
--------------------
foo | 1
foo | 1
bar | 1
foo | 1
要在聚合函数(如
sum()
或count()
中使用的列必须排除在group by
子句之外。只将要唯一输出的列放入其中。这是因为多列组要求所有列的值都相同。
有关详细信息,请参阅此链接
实际上,在您的例子中,如果一些是相等的,那么表1的id就不相等(反之亦然)。因此,分组不可能发生。因此,所有这些都是单独显示的
如果条目是这样的
SELECT a.name,
COUNT(r.some)
FROM t1 a
JOIN t2 r on a.id=r.table_1_id
WHERE a.include = 'true'
GROUP BY a.name
那么输出就会是
id | some | table_1_id
-------------------------
1 | 42 | 1
2 | 43 | 1
3 | 42 | 2
4 | 42 | 1
实际上,如Juergen所说,如果您想在1列上分组,您可以删除
r.some代码>来自groupby子句。啊,这很有道理!您正在拉取a.name
列,即使您没有对其进行分组–这会在Oracle中编译吗?感谢阅读链接,现在它更有意义了。希望我能打两个复选标记:(
name | count
------------------
foo | 2 (for 42)
foo | 1 (for 43)
bar | 1 (for 42)