【问题标题】:How to write a SQL query to calculate percentages based on values across different tables?如何编写 SQL 查询来根据不同表中的值计算百分比?
【发布时间】:2020-12-09 19:24:36
【问题描述】:

假设我有一个包含两个表的数据库,如下所示:

Table 1:

tweet_id  tweet
1         Scrap the election results
2         The election was great!
3         Great stuff

Table 2:

politician  tweet_id
TRUE        1
FALSE       2
FALSE       3

我正在尝试编写一个 SQL 查询,它返回包含单词 'election' 的推文的百分比,按他们是否是政治家进行细分。

例如在这里,Table 1 中的前 2 条推文包含单词 election。通过查看Table 2,您可以看到tweet_id 1 是由politician 编写的,而tweet_id 2 是由non-politician 编写的。

因此,SQL 查询的结果应该为政客返回 50%,为非政客返回 50%(即两条推文包含“选举”一词,一条由政客撰写,一条由非政客撰写)。

有什么想法可以用 SQL 编写吗?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql multiple-columns


【解决方案1】:

您可以通过创建一个子查询来返回所有选举推文,并创建一个子查询来返回政治家的所有选举推文,然后加入。

这是一个示例。请注意,您可能需要在除法之前将总数转换为小数(取决于您使用的 SQL 提供程序)。

select 
    politician_tweets.total / election_tweets.total
from
(
select
  count(tweet) as total
from
  table_1
  join table_2 on table_1.tweet_id = table_2.tweet_id
where
  tweet like '%election%'
) election_tweets

join
(
select
  count(tweet) as total
from
  table_1
  join table_2 on table_1.tweet_id = table_2.tweet_id
where
  tweet like '%election%' and
  politician = 1
) politician_tweets
on 1 = 1

【讨论】:

  • 由于某种原因返回 0。任何想法为什么?
  • 绝对——它是用一个整数除以一个整数,所以它返回一个整数。在除法之前,您必须将它们转换为小数。您使用的是什么 sql 提供程序? MySQL?微软 SQL 服务器? PostgreSQL? (这会影响正确的转换/转换语法)
【解决方案2】:

你可以像这样使用聚合:

select t2.politician, avg( case when t.tweet like '%election%' then 1.0 else 0 end) as election_ratio
from tweets t join
     table2 t2
     on t.tweet_id = t2.tweet_id
group by t2.politician;

Here 是一个 dbfiddle。

【讨论】:

  • 感谢您的意见,但该解决方案无法完全发挥作用。它为政客返回 3%,为用户返回 3%。然而,它应该产生增加 100% 的结果,因为这与在推特上发布带有“选举”一词的政客和非政客的比例有关。有什么想法吗?
  • @HelpMe 。 . .有用。我添加了一个 dbfiddle 来说明您的示例数据。
猜你喜欢
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2013-03-16
相关资源
最近更新 更多