查询两个查询之间的比率

时间:2014-11-29 18:46:15

标签: mysql sql

假设我的表格格式类似于(但有更多项目和区域):

Item      State     Price
Apple     Georgia   8.00
Apple     Alaska    9.00
Apple     Texas     3.00
Orange    Georgia   5.00
Orange    Alaska    3.00
Orange    Texas     6.00

(假设每个区域每个水果都有一个价格也是安全的,每个区域都列出了每个水果,所以除以0就不太可能发生。)

我想找到一个地方每个水果的平均价格与其他地方水果平均价格的比率。单独完成每个操作非常简单:

(Q1)

SELECT AVG(Price) 
FROM TABLE 
WHERE State = 'Georgia' 
GROUP BY Item

查找格鲁吉亚每种水果的平均价格,

(Q2)

SELECT AVG(Price) 
FROM TABLE 
WHERE State <> 'Georgia' 
GROUP BY Item

查找除格鲁吉亚以外的每种水果的平均值,但如何将这两种水果放在一起以获得比率?

我尝试过类似的事情:

SELECT Item, Q1/Q2 
FROM TABLE  
GROUP BY Item

但是我收到一个错误,告诉我我的子查询返回多行。另一种尝试涉及删除我的Q1和Q2中的GROUP BY子句,但后来我得到的是一个表,每个水果在第二列中具有相同的数字。非常感谢您提供的任何帮助。

编辑:我只对一个特定州的每个项目的价格与项目价格相对于其他所有州的价格比率感兴趣。因此,运行查询应该产生如下结果:

Item      Price(Georgia)/Price(State-[Georgia])
Apple     X
Orange    Y

......等等。我所说的是我不需要为每个州找到这个,特别是一个特定的州。

2 个答案:

答案 0 :(得分:0)

您可以使用子查询和cross join

执行此操作
select s1.state, s2.state, s1.avgprice / s2.avgprice as stateratio
from (select state, avg(price) as avgprice
      from table t
      group by state
     ) s1 cross join
     (select state, avg(price) as avgprice
      from table t
      group by state
     ) s2

答案 1 :(得分:0)

使用自我加入比较一个州的商品价格与所有州的商品的平均价格:

SELECT
  p1.Item, p1.State, p1.price / AVG(p2.price)
FROM
  prices AS p1
  JOIN prices AS p2 ON p1.Item = p2.Item
GROUP BY
  p1.Item,
  p1.State,
  p1.Price

结果:

ITEM    STATE   P1.PRICE / AVG(P2.PRICE)
Apple   Alaska  1.35
Apple   Georgia 1.2
Apple   Texas   0.45
Orange  Alaska  0.642857
Orange  Georgia 1.071429
Orange  Texas   1.285714

小提琴:http://sqlfiddle.com/#!2/32382a/2/0

请注意,您可以将一个州的商品价格与所有其他州的平均值(而非所有州)进行比较,方法是将AND p1.State <> p2.State添加到JOIN。但这似乎在统计上不那么合理。

-

OP编辑:

  编辑:我只对每个项目的价格比例感兴趣   一个特定的状态超过项目的价格而不是其他   州。因此,运行查询应该产生如下结果:

然后查询将成为:

SELECT
  p1.Item, p1.price / AVG(p2.price)
FROM
  prices AS p1
  JOIN prices AS p2 ON p1.Item = p2.Item
WHERE
  p1.State = 'Georgia'
  AND p2.State <> 'Georgia'
GROUP BY
  p1.Item,
  p1.Price