【问题标题】:sql join two tables and get cumulative countsql连接两个表并获取累积计数
【发布时间】:2016-12-22 13:54:22
【问题描述】:

我有以下两张表,

表 1:

id    document
--------------
A3  B2 
A3  B400 
A5  B100 
A5  B500   
A7  B200 
A8  B6 
A8  B2 
A8  C1    
A8  B3 

表 2:

id    name
--------------
A1  Jack 
A2  Martin 
A3  Jack 
A4  Thomas 
A5  Jack 
A6  Thomas 
A7  Thomas 
A8  John 
A9  John 
A10 Kate 

我的过滤器如下,应该比较 document 列并基于此列表进行过滤:

WHERE table1.document IN (B2,B400,B100,B500,B200,B6,B2,B3)

结果应该是这样的:

name    freq
--------------
Jack    4
Thomas  1
John    3

解释: 首先,我过滤我在WHERE IN 子句中拥有的文档。然后查看table1中剩余文档id列对应的值, 在第二个表的第一列中查看 id,并获取该 ID 对应的 name 并将其放入我的结果表中。
比如A3重复了两次,它对应的nameJack,所以到目前为止Jack在freq列中的值为3,但是由于下一个id在 我的 table1 是 A5,重复了两次,恰好也有 Jack 作为它的名字,所以 jack 将有 4 作为频率。
对于table1中的下一个值,A7的对应名称为Thomas,因为A7重复了一次,并且没有其他对应名称为Thomas的id 不在我的 table1 列表中,那么 Thomas 的频率为 1(我在 table1 中没有 A4,也没有 A6)。
在最后一个示例中,我在 table1 中重复了 4 次 A8,但是,由于我在 WHERE IN 中的列表不包含 C1,因此该条目将被过滤 并没有计算,所以我还剩下三个A8,名字是John,然后它的值是3。

这是demo 数据。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    似乎一个简单的JOINGROUP BY 可以给出所需的结果:

    SELECT t2.name, COUNT(*) AS freq
    FROM table1 AS t1
    JOIN table2 AS t2 ON t1.id = t2.id
    WHERE t1.document IN ('B2','B400','B100','B500','B200','B6','B2','B3')
    GROUP BY t2.name;
    

    【讨论】:

    • @marcel 您好,我会在找到空闲时间后尽快回复您解决其他问题。你的帖子总是很有趣。
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多