从一个表中选择列并从另一个表中计数

时间:2013-07-18 16:58:26

标签: 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

期望的输出:

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;

但这似乎让我

name | count(r.some)
--------------------
foo  | 1
foo  | 1
bar  | 1
foo  | 1

我不是sql专家(我可以做简单的查询)所以我也在谷歌搜索,但找到我发现的大多数解决方案给我这个结果。我可能错过了一些非常简单的事情。

2 个答案:

答案 0 :(得分:10)

只需从group by子句中删除第二列

即可
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

要在sum()count()等聚合函数中使用的列必须省略group by子句。只将列放在那里你想要独特输出。

答案 1 :(得分:1)

这是因为多列组要求所有列值相同。

有关详细信息,请参阅此链接。Using group by on multiple columns

实际上在你的情况下,如果有些相等,则table_1_id不相等(反之亦然)。所以分组不会发生。所以都是单独显示的。

如果条目如此,

id | some | table_1_id
-------------------------
1  | 42   |     1
2  | 43   |     1
3  | 42   |     2
4  | 42   |     1

然后输出就是。,

name | count
------------------
foo  | 2     (for 42)
foo  | 1     (for 43)
bar  | 1     (for 42)

实际上,如果你想按照Juergen的说法对1列进行分组,你可以从groupby子句中删除r.some;