【问题标题】:MYSQL Query with percentage and other restrictions具有百分比和其他限制的 MYSQL 查询
【发布时间】:2013-06-04 09:51:36
【问题描述】:

您好,我是 MySQL 新手,现在正在上学,想弄清楚我的导师提出的一个问题。问题来了:

Select ID, name, Country and Population from City Table, Select Life Expectancy, Name, SurfaceArea and GNP from the Country Table.

使用以下限制结果集,

  1. 国家/地区面积介于 3,000,000 和 40,000,000 之间(使用 between 运算符)
  2. City.District 字段的长度大于 4
  3. 创建计算字段“CityPopulationPercentageOFCountryPopulation”,用于计算字段建议的内容”

这就是城市表的描述:

ID、姓名、国家、地区、人口

这就是国家表的描述:

代码、名称、大陆、地区、地表面积、独立年份、人口、 LifeExpectancy, GNP, LocalName, GovernmentForm, HeadOfState, Capital, 代码2

我已经尝试过这个和其他变体但没有运气:

Select City.ID, City.Name, City.Country, City.Population, Country.LifeExpectancy, Country.Name, Country.SurfaceArea, Country.GNP, 
(Select City.Population / Country.Population * 100, Count(City.Population / Country.population *100) AS "CityPopulationPercentageofCountryPopulation")
From City, Country
Where Country.SurfaceArea BETWEEN 3000000 and 40000000;

就像我说的那样,我是新手,并尽力通过在线查看等来弄清楚。一些帮助,也许以及解释你如何解决它真的会有所帮助

问候,

【问题讨论】:

  • 这是家庭作业吗?老师已经给你了,所以你应该自己试试。或者你将如何学习?
  • @echo_Samir 这是关于作业的问题,是的。我看过这本书,但他没有按照我们需要为课程订购的书。我总共花了大约 3 个小时查看不同的网页和书籍以尝试不同的事情,但没有运气,这就是我来这里的原因。也许一个方向会有所帮助。谢谢问候
  • 您需要正确加入表格,以便每个城市都有其特定的国家数据。
  • 您也不需要子查询或计数 - 一旦表被连接,您在子查询中的第一个字段就可以了。 WHERE 可以作为第一个限制,但您需要使用AND 将市区限制的长度添加到它。
  • @Orbling 感谢您的指导,我将对查询进行一些更改,但可能需要一段时间。一旦我完成并测试了一段时间,我将在这里发布我的更改。问候

标签: mysql


【解决方案1】:

以下是按国家/地区获取城市与国家/地区百分比的方法。我可以告诉你这一点,因为你与上面发布的查询非常接近。

SELECT
  City.Country,
  SUM(City.Population) / Country.Population * 100 AS CityPopulationPercentageOFCountryPopulation
FROM City
INNER JOIN Country ON City.Country = Country.Code
GROUP BY City.Country

您的讲师是否介绍过内联视图,其中子查询像表格一样使用?我希望如此,因为这就是您将计算列包含在每个城市中的方式。这是包含城市 ID、城市名称、城市人口、国家代码和城市人口百分比的简化版本:

SELECT
  City.ID,
  City.Name,
  City.Country,
  City.Population,
  PopPercent.CityPopulationPercentageOFCountryPopulation
FROM City
INNER JOIN (
    SELECT
      City.Country,
      SUM(City.Population) / Country.Population * 100 AS CityPopulationPercentageOFCountryPopulation
    FROM City
    INNER JOIN Country ON City.Country = Country.Code
    GROUP BY City.Country
) PopPercent ON City.Country = PopPercent.Country

您可以使用上面的查询并将另一个连接添加到Country 以获取国家/地区值,然后您应该拥有按表面积以及城市区域名称的长度过滤所需的所有信息。我会把那部分留给你:)

最后一点:我今天下午没有可用的 MySQL,所以这是来自内存,未经测试。如果有任何错误,我深表歉意。

【讨论】:

  • 非常感谢您提供上面的示例,它们非常有用,但我认为我的导师不会期望如此复杂的东西;对我来说很复杂。我的讲师确实对子查询进行了修改,但不像您使用过的那样。是否有更简单的方法来完成这个问题?也许像您这样的高级 PPL 不会使用的东西?再次感谢您的回复,我已经审查了一段时间,现在更改了我的查询。我还看到你使用了 INNER Join 为什么不使用 Left join?只是出于好奇和理解目的。问候
  • 您的示例非常有帮助,我发布了我认为我的导师正在寻找的内容。感谢您的帮助,因为没有它,我无法走到这一步。话虽如此,如果您在 OBLINGs cmets 中查看我的查询,我无法将名称更改为子查询列。您能否回顾一下并让我知道我做错了什么或引导我朝着正确的方向前进。再次感谢您的问候,
  • 我能够弄清楚如何更改列名。我把它贴在 Orbling 的 cmets 下。感谢您的帮助,我很感激,如果您有什么要补充的,请告诉我,
  • 我很高兴这对你有用,是的 - 如果你没有涵盖内联视图(一个子查询像一个桌子)。请注意,在像您这样的情况下,使用 Country 表中的所有行,内联视图会快得多。你很快就会明白的 :) 最后,很抱歉我无法回答你的后续问题——第一个问题是在我结束一天的工作并开始忙碌的夜晚之后不久出现的。祝你学习顺利!
【解决方案2】:

选择 City.ID, City.Name, City.Country, City.Population, Country.LifeExpectancy, Country.SurfaceArea, Country.Name, Country.GNP, (Select City.Population / Country.Population * 100) AS CityPopulationPercentageOfCountryPopulation 从 City INNER JOIN Country ON City.Country=Country.Code 其中 Country.SurfaceArea BETWEEN 3000000 和 40000000 且 LENGTH(City.District)>4 限制200;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2022-01-23
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多