SQL sum 按列分组,包括与从属相同的表的行

Posted

技术标签:

【中文标题】SQL sum 按列分组,包括与从属相同的表的行【英文标题】:SQL sum group by column including rows of same table as dependents 【发布时间】:2021-10-09 01:08:13 【问题描述】:

我想查看用户发送了多少条消息,因此我有一个存储频道的表和另一个存储作者和实际数据的表。其中一个重要部分是频道可以是子频道,这意味着它们是另一个频道的子频道,但也有自己的 ID。

表 1

Row ID Guild ID Channel ID Parent Channel ID (foreign key on Table 1 Channel ID)
1 1 2 null
2 1 3 null
3 1 4 3

表 2

Row ID Parent Channel ID (foreign key on Table 1 Channel ID) Author ID Messages
1 2 1 6
2 3 2 54
3 4 1 3

我有一个查询,它从不属于任何其他频道 ID 的频道 ID 获取消息的总和:

SELECT sc."guild_id" guild, sc."channel_id" channel, sum(s."NUM") num
FROM statistic s
         INNER JOIN statschannel sc on s.parent_channel_id = sc.channel_id
GROUP BY sc."guild_id", sc."channel_id";

我想更改查询,以便 (GUILD ID 1, CHANNEL ID 3)SUM() 包含 (GUILD ID 1, CHANNEL ID 4) 的总和,因为 ID 为 4 的频道是子频道。我尝试进行内部连接,如下所示,但它只返回具有父 ID 的频道的结果。

SELECT sc."guild_id" guild, sc."channel_id" channel, sum(s."NUM") num
FROM statistic s
         INNER JOIN statschannel sc on s.parent_channel_id = sc.channel_id
         INNER JOIN statschannel sc2 on sc.parent_channel_id = sc2.channel_id
GROUP BY sc."guild_id", sc."channel_id";

我不知道在这里做什么。我想要返回的数据应该是这样的:

Guild ID Channel ID Messages
1 2 6
1 3 57 ( 54 + 3)
1 4 3

【问题讨论】:

【参考方案1】:

我设法制定了一个提供我想要的结果的解决方案。

SELECT "statschannel"."guild_id"          "guild_id",
       "statschannel"."channel_id"        "channel_id",
       SUM("statistic2"."NUM") + COALESCE(SUM("statistic"."NUM"), 0)            "num"
FROM "statschannel"
         LEFT OUTER JOIN "statschannel" "statschannel__parent_channel"
                         ON "statschannel__parent_channel"."channel_id" =
                            "statschannel"."parent_channel_id"
         LEFT OUTER JOIN "statistic" ON "statschannel__parent_channel"."channel_id" =
                                        "statistic"."parent_channel_id"
        LEFT OUTER JOIN "statistic" "statistic2" ON "statschannel".channel_id =
                                                    "statistic2".parent_channel_id
GROUP BY statschannel."guild_id", "statschannel"."channel_id"

这将提供以下结果:

guild_id channel_id messages
1 2 6
1 3 57
1 4 3

【讨论】:

以上是关于SQL sum 按列分组,包括与从属相同的表的行的主要内容,如果未能解决你的问题,请参考以下文章

Hive 在使用 case 语句和聚合时按列分组出错

按列对分组数据帧进行采样

(Presto)SQL:按列“A”和“B”以及计数列“C”分组,但也包括仅按“A”分组的“C”计数

使用pandas按列分组,然后根据条件新建一列

按列值的差异对 SQL 中的数据进行分组

SUM 值按列分组,但不能“聚合”?