【问题标题】:count value in three separate columns - Rails/SQL在三个单独的列中计算值 - Rails/SQL
【发布时间】:2018-02-01 13:02:14
【问题描述】:

有一个表roasts,它包含三列countrycountry2country3。这些列用于指示混合咖啡来自哪些国家。因此,国家名称可以出现在三列中的任何一列中。虽然我可以对任何给定列进行计数,但我想计算一个值在所有三个国家/地区列中出现的次数。

我想在 Rails/ActiveRecord 中执行此操作。我已经知道了下面的 SQL,但是这个输出不正确:

SELECT country, country2, country3, COUNT(*) AS CountryCount FROM roasts GROUP BY country, country2, country3;

我怀疑这就是我的分组方式。

【问题讨论】:

  • 这是一个现有的数据库还是您正在进行设计。看起来不太好:)。重复的列(例如 country、country2、country3)应该在一个单独的表中(roast_id 和 country)。此外,国家也应该在另一个表中(由他们的 country_id 引用),而不仅仅是国家名称。这将允许更灵活的解决方案(3 个国家是绝对最大值吗?),国家名称中的错误更少,查询更容易(从烤肉、国家烤肉、烤肉 ID = 烤肉.id 的国家中选择国家名称、计数(*)和country_id = countries.id 按国家/地区名称分组)
  • @Pablo。这是一个现有的数据库,我正在增加它的复杂性。它实际上比我在这里描述的更糟糕,因为每个国家也会有许多地区,实际上,每种咖啡都有相关的属性,例如 altitudeprocessvariety 但是我不知道是什么这些值是,并留给用户创建这些。

标签: sql ruby-on-rails postgresql


【解决方案1】:

您应该有一个名为 CoffeeCountries 的表格,每个国家/地区的每个混合都有一行。我强烈建议您更改数据结构。

使用您的数据结构,您需要对数据进行反透视。因为您的数据很小,而且您可能不熟悉横向连接,所以我将使用union all 方法:

select country, count(*)
from ((select country1 as country from roasts) union all
      (select country2 as country from roasts) union all
      (select country3 as country from roasts)
     ) c
where country is not null
group by country
order by count(*) desc;

如果您有一张大表,我会推荐横向连接。此版本扫描表格 3 次(每个国家/地区一次)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多