【问题标题】:Selecting column from one table and count from another从一个表中选择列并从另一个表中计数
【发布时间】:2013-07-17 18:29:26
【问题描述】:
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 专家(我可以做简单的查询),所以我也在谷歌搜索,但找到的大多数解决方案都给了我这个结果。我可能错过了一些非常简单的东西。

【问题讨论】:

    标签: sql oracle oracle-sqldeveloper


    【解决方案1】:

    只需从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 子句中排除。只将您想要唯一输出的列放在那里。

    【讨论】:

    • 啊,有道理!
    • 即使您没有对它进行分组,您也正在拉动a.name 列——这会在 Oracle 中编译吗?
    【解决方案2】:

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

    查看此链接了解更多信息。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;

    【讨论】:

    • 感谢阅读链接,现在更有意义了。希望我能给 2 个复选标记 :(
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2011-08-23
    • 2014-06-12
    相关资源
    最近更新 更多