【问题标题】:SQL: Joining tables and dividing each cell by match cell in another table?SQL:连接表格并将每个单元格除以另一个表格中的匹配单元格?
【发布时间】:2021-02-20 11:55:03
【问题描述】:

这是我的人口数据集,详细说明了 2010 年至 2019 年每个州的人口:

这是我的消费者投诉数据集,其中包含收到日期和状态:

我已经收到了每年每个州的投诉:

我知道我需要在 state 上加入 compltsbypear 和 uspop,并在每个比赛年将 2011(来自投诉)/ 2011 从 uspop 等分开。

如何编写显示各州以及每年投诉与人口比率的查询?

【问题讨论】:

  • (1) 用您正在使用的数据库标记您的问题。 (2) 样本数据和期望结果作为文本表格是首选。 (3) 所有代码都应始终以文本而不是图像的形式包含在内。 (4) 一个 db/sql fiddle 会有所帮助。

标签: sql join match union where-clause


【解决方案1】:

我会通过取消透视人口数据来解决此问题,因此每个州和每年都有一行。然后汇总投诉和join

您的代码看起来像 SQL Server,所以我将使用这些约定:

with up as (
      select v.*
      from uspop u cross apply
           (values (u.area, 2010, u.[2010]),
                   (u.area, 2011, u.[2011]),
                   . . . 
          ) v(state, year, pop)
     ),
     cc as (
      select year(datereceived) as year, state, count(*) as num_complaints
      from consumercomplaints cc
      group by year(datereceived), state
     )
select up.state, up.year, cc.num_complaints, up.pop,
       (cc.num_complaints * 1.0 / up.pop) as complaint_ratio
from up join
     cc
     on up.state = cc.state and up.year = cc.year;

这会以每个州/年一行的完全合理的格式产生您想要的结果。如果您希望它采用不同的格式,您似乎知道如何对数据进行透视。

【讨论】:

  • 非常感谢!这非常有帮助,让我得到了我需要的东西。我相信对于v(area, year, pop) 部分,区域应该是状态。在我做了那个微小的改变之后它就起作用了。
猜你喜欢
  • 1970-01-01
  • 2022-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多