如何计算Mysql中的比例?

时间:2015-10-27 13:39:34

标签: mysql

我有一张像这样的表hw1:

+--------+--------+----------+
| budget | price  | count(*) |
+--------+--------+----------+
| high   | high   |        9 |
| high   | low    |       13 |
| high   | medium |       20 |
| low    | high   |       60 |
| low    | low    |       94 |
| low    | medium |      162 |
| medium | high   |      151 |
| medium | low    |      228 |
| medium | medium |      355 |
+--------+--------+----------+

我想在右侧添加另一列,看起来像"count(*)/budget样本大小“ 例如,对于第一行where budget = high and price = high, 我们会得到一个数字calculated by 9/42(42是高预算样本量= [9 + 13 + 20])

我尝试过以下代码但结果为null

select (select count(*) from hw1 where count(*) like 'a%') / 
(select count(*) from hw1 where budget like 'b%') from hw1;

我相信这并不难,但我无法得到结果..有人可以帮助我吗?我对mysql不是很有经验..

先谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用其他查询来获取budget的每个值的“预算样本大小”,然后将该查询的结果用作行来源。

(如果没有表格和示例数据的定义,我们只是猜测您将使用的查询。)

  SELECT r.budget
       , COUNT(*) AS budget_sample_size
    FROM hw1 r
   GROUP BY r.budget

我们希望查询返回每个budget值一行的结果,例如

  budget  budget_sample_size
  ------  ------------------
  high                    42
  low                    316 
  medium                 734

现在的诀窍是将该查询用作另一个查询中的行源。我们将这个查询包装在parens中,并在另一个查询的FROM子句中引用它,就像它是一个表一样。举个简单的例子......

SELECT s.budget
     , s.budget_sample_size
  FROM ( 
         SELECT r.budget
              , COUNT(*) AS budget_sample_size
           FROM hw1 r
          GROUP BY r.budget
       ) s

通过使用这样的查询,作为行源,我们可以使查询返回的值在外部查询中可用。用作这种行源的查询称为“内联视图”。在MySQL版本中,它被称为“派生表”。

作为该查询的示例:

 SELECT t.budget
      , t.price
      , COUNT(*) 
      , s.budget_sample_size
      , COUNT(*)/s.budget_sample_size
   FROM hw1 t
   JOIN ( 
          SELECT r.budget
               , COUNT(*) AS budget_sample_size
            FROM hw1 r
           GROUP BY r.budget
        ) s
     ON s.budget = t.budget
  GROUP
     BY t.budget
      , t.price

注意:此示例查询依赖于针对GROUP BY行为的特定于MySQL的扩展。其他数据库会抛出错误(“SELECT列表中的非聚合不在GROUP BY中”)。它只需要对查询进行一些小调整即可使其在其他数据库中工作...例如添加MAX()聚合函数...将s.budget_sample_size表达式替换为MAX(s.budget_sample_size)

答案 1 :(得分:0)

请更改字段的名称' count(*)'
并且可能澄清你的问题 然而

SELECT 
 (SELECT [count(*)] FROM hw1 WHERE budget like 'high' AND price like 'high') / 
 (SELECT SUM([count(*)]) FROM hw1 WHERE budget like 'high')

答案 2 :(得分:0)

既然您既没有提供原始表结构也没有提供原始数据源,也没有提供您的查询 - 这是我的猜测方法:

SELECT hw1.*, 
      count(*) count_price, 
      (count(*)/b.budget_all) price_share 
FROM hw1 
LEFT JOIN (
   SELECT budget, COUNT(*) budget_all
   FROM hw1 
   GROUP BY budget
) b
ON b.budget = hw1.budget

答案 3 :(得分:0)

嗨,如果我理解你的答案,我认为你可以做这样的事情

SELECT t1.buget, t1.price, t1.cnt, t1.cnt / t2.sumCnt
FROM myTable AS t1
INNER JOIN (SELECT buget, SUM(cnt) AS sumCnt
           FROM myTable
           GROUP BY buget) AS t2
ON t1.buget = t2.buget;

它的简单内连接语句和子查询将返回像这样的结果

  buget | sumCtn
  --------------
  high  |  42
  --------------
  low   |  316 
  --------------

等...

你可以在选择语句中使用简单的垫子来加入你的桌子......

另请注意,我更改了列的一个小名称,因此不要对此感到困惑。

GL!

P.S。这是SQL FIDDLE,看看它是如何运作的......