关于sql:从一个表中选择列并从另一个表中计数

Selecting column from one table and count from another

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

期望的输出:

1
2
3
4
name | COUNT(SOME)
------------------
foo  | 3
bar  | 1

我目前通过其他解决方案查看:

1
2
3
4
5
6
7
8
9
    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;

但这似乎得到了我

1
2
3
4
5
6
name | COUNT(r.some)
--------------------
foo  | 1
foo  | 1
bar  | 1
foo  | 1

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


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

1
2
3
4
5
6
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子句中。 只将列放在那里你想要独特输出。


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

有关详细信息,请参阅此链接。,在多列上使用group by

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

如果条目是这样的,

1
2
3
4
5
6
id | SOME | table_1_id
-------------------------
1  | 42   |     1
2  | 43   |     1
3  | 42   |     2
4  | 42   |     1

那么输出就是。,

1
2
3
4
5
name | COUNT
------------------
foo  | 2     (FOR 42)
foo  | 1     (FOR 43)
bar  | 1     (FOR 42)

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