【问题标题】:SQL Function and order by result?SQL 函数并按结果排序?
【发布时间】:2014-02-12 16:22:13
【问题描述】:

我有这种关系; 国家(名称、代码、首都、省、地区、人口)

我想从哪里获取语言(名称)、使用它们的国家/地区数量以及每种语言的母语使用者数量。

我很确定我几乎完成了这个,但我认为我没有掌握“ORDER BY”的真正用途,因为我对 count(l.name) 的计算得到了凌乱,只有当我确定该数据库包含在多个国家/地区使用某种语言的信息时才获得值“1”!

SELECT DISTINCT l.name, count(l.name) as SpokenIn, 
l.percentage*c.population as NativeSpeakers 
FROM (country c 
JOIN language l
ON c.code = l.country)
GROUP BY l.name, NativeSpeakers;

所有其他行都很好,只有“SpokenIn”关系很乱。我做错了什么:(

我正在使用 PostgreSQL。

【问题讨论】:

  • 嗯,首先,您确实不需要 DISTINCT 限定符,因为您的 group by 子句指定了您希望计数所基于的字段。您将获得“1”作为计数,因为 DISTINCT 最终会为每个结果提供一行。其次,您似乎正在尝试按国家/地区进行百分比计算,但尝试对整个语言进行计数...
  • 使用SUM 代替COUNT1.name 有效吗?
  • 这个查询中的ORDER BY在哪里,你的意思是GROUP BY吗?
  • 最好创建一个 SQLFIDDLE,以便轻松验证答案。

标签: sql database function postgresql


【解决方案1】:

试试:

select l.name,
       counter.num_countries as SpokenIn,
       sum(l.percentage * c.population) as NativeSpeakers
  from country c
  join language l
    on c.code = l.country
  join (select name, count(country) as num_countries
          from language
         group by name) counter
    on l.name = counter.name
 group by l.name, counter.num_countries

编辑 - 修复了“counties”与国家的拼写错误

【讨论】:

    【解决方案2】:

    我不是 PostgreSQL 专家,但我认为你犯了一个小小的分组错误。您正在对 NativeSpeakers 列进行分组,但您实际上想要所有母语人士的总和。请尝试以下操作:

    SELECT l.name, count(c.name) as SpokenIn, 
    sum(l.percentage*c.population) as NativeSpeakers 
    FROM (country c 
    JOIN language l
    ON c.code = l.country)
    GROUP BY l.name;
    

    如果你想更进一步: http://www.sqlfiddle.com/#!15/0d0bc/3

    【讨论】:

      【解决方案3】:

      您只是想弄清楚每种语言有多少人说吗?如果是这样,这可能是构造查询的更好方法:

          SELECT DISTINCT l.name, sum(l.percentage*c.population) as SpokenBy 
          FROM (country c 
          JOIN language l
          ON c.code = l.country)
          GROUP BY l.Name
      

      【讨论】:

      • 不是真的...我添加了所有母语人士的总和。可能是他希望每个国家/语言都有一行。那么你的解决方案更适合工作。目前还不清楚他想做什么......
      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多