【问题标题】:SQL AVG on CountSQL AVG 计数
【发布时间】:2017-07-26 10:58:51
【问题描述】:

我有两个通过Computer_ID 连接的表。

第一个是Computer_IDBrandCountry,其中包含计算机、它们的品牌和原产国。

第二个表包含有关 CPU 的信息:Computer_IDCPU_Manufacture

请注意每台计算机可以有多个 CPU

我想获取每个国家/地区的 英特尔 CPU 的平均数量,该计算机的品牌为 Dell

我希望得到这样的结果:

Country      |Avg CPUs
United-States|2.5
Canada       |3.2

来自Computers 表的示例数据:

Computer_ID|Brand|Country
1          |Dell  |United-States
2          |Lenovo|United-States
3          |Lenovo|United-States
4          |Lenovo|United-States
5          |HP    |United-States
6          |Dell  |Canada
7          |Dell  |Canada

来自CPU 表的示例数据:

Computer_ID|CPU_Manufacture
1          |Intel
1          |Intel
2          |Intel
2          |AMD
2          |AMD
3          |AMD
4          |AMD
4          |Intel

这就是我计算每个国家英特尔制造的 CPU 数量的方法:

SELECT COMPUTERS.NATIVE_COUNTRY, COUNT(*) FROM COMPUTERS
INNER JOIN CPUS ON CPUS.COMPUTER_ID = COMPUTERS.COMPUTER_ID AND CPUS.MANUFACTURE = 'Intel'              
GROUP BY COMPUTERS.NATIVE_COUNTRY;

现在基本上我需要将每个COUNT 除以每个国家/地区的Dell computers 数量。

【问题讨论】:

    标签: sql sql-server join count average


    【解决方案1】:

    只需添加一个有子句

    SELECT COMPUTERS.NATIVE_COUNTRY, COUNT(*) FROM COMPUTERS INNER JOIN CPUS ON CPUS.COMPUTER_ID = COMPUTERS.COMPUTER_ID AND CPUS.MANUFACTURE = 'Intel' GROUP BY COMPUTERS.NATIVE_COUNTRY HAVING COMPUTERS.BRAND = 'DELL';

    【讨论】:

      【解决方案2】:

      如果我理解正确的话。 . .

      SELECT c.NATIVE_COUNTRY, COUNT(*),
             AVG(CASE WHEN c.BRAND = 'Dell' THEN 1.0 ELSE 0 END) as dell_avg
      FROM COMPUTERS c LEFT JOIN
           CPUS cp
           ON cp.COMPUTER_ID = c.COMPUTER_ID AND cp.MANUFACTURE = 'Intel'              
      GROUP BY c.NATIVE_COUNTRY;
      

      【讨论】:

      • 这几乎是正确的答案,但万一电脑没有cpus,我想把它算作0 cpus,但仍然增加电脑的数量。我的意思是,有可能某些 computer_id 甚至不会出现在 CPUs 表中。
      • @LiaPopa 。 . . LEFT JOIN 可能会做你想做的事。
      【解决方案3】:

      此解决方案应如您所愿:

      ;WITH cte AS (
          SELECT Country,[Computers]=COUNT(*) FROM Computers com
          WHERE Brand = 'Dell'
          GROUP BY Country
      ),
      cte2 AS (
          SELECT Country,Cores=COUNT(*) FROM Computers com
          JOIN CPU cpu ON com.Computer_ID=cpu.Computer_ID
          WHERE CPU_Manufacture='Intel'
          GROUP BY Country
      )
      SELECT cte.Country,[Cores per computer]=ISNULL(Cores,0)*1./Computers
      FROM cte
      LEFT JOIN cte2 ON cte.Country=cte2.Country
      

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多