SQL子查询计算

时间:2016-03-16 11:40:01

标签: sql oracle subquery oracle-apex

我有这张桌子:

╔═════╤═══════╤═══════╗
║ ID  │ Group │ Value ║
╠═════╪═══════╪═══════╣
║ ID1 │ 1     │ 10    ║
╟─────┼───────┼───────╢
║ ID2 │ 1     │ 5     ║
╟─────┼───────┼───────╢
║ ID2 │ 1     │ 4     ║
╟─────┼───────┼───────╢
║ ID2 │ 1     │ 6     ║
╟─────┼───────┼───────╢
║ ID1 │ 2     │ 1     ║
╟─────┼───────┼───────╢
║ ID2 │ 2     │ 7     ║
╟─────┼───────┼───────╢
║ ID2 │ 2     │ 8     ║
╟─────┼───────┼───────╢
║ ID2 │ 2     │ 3     ║
╟─────┼───────┼───────╢
║ ID3 │ 3     │ 6     ║
╟─────┼───────┼───────╢
║ ID2 │ 3     │ 4     ║
╟─────┼───────┼───────╢
║ ID2 │ 3     │ 1     ║
╟─────┼───────┼───────╢
║ ID2 │ 3     │ 9     ║
╚═════╧═══════╧═══════╝

我想做以下事情:

  1. 查找ID = ID1
  2. 的所有组
  3. 提取与ID = ID1
  4. 属于同一组的ID2的平均值

    ID1仅在Group1和Group2中找到。因此ID2的平均值 组1 =(5 + 4 + 6)/ 3 = 5

    和Group2 =(7 + 8 + 3)/ 3 = 6

    1. 计算ID1值相对于每组ID2平均值的百分比。
    2. 组1 =(10 * 100%)/ 5 = 200%

      组2 =(1 * 100%)/ 6 = 16%

      我知道如何单独执行这些步骤,但我不知道如何在第二个查询中使用第一个查询(组)的列表。

      Search_Item =' ID1'

      Select Group FROM MyTable WHERE ID = 'ID1'
      

      - >返回1和2

      Select AVG(Value) FROM MyTable WHERE ID = 'ID2' AND Group = '1' 
      Select AVG(Value) FROM MyTable WHERE ID = 'ID2' AND Group = '2'
      

      非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以这样做:

SELECT t.group,NVL(avg(s.value),0),(MAX(t.value)*100/NVL(avg(s.value),1)) as Perc
FROM(
    SELECT group,max(value) as value FROM MyTable WHERE ID = 'ID1' group by group) t
LEFT OUTER JOIN Mytable s
 ON(t.group = s.group and s.ID = 'ID2')
GROUP BY t.group

答案 1 :(得分:1)

你可以使用这样的单一表格扫描来完成它:

SELECT   "GROUP",
         100 * SUM( CASE id WHEN 'ID1' THEN value END )
             / AVG( CASE id WHEN 'ID2' THEN value END )
           AS Percentage
FROM     MyTable
GROUP BY "GROUP"
HAVING   COUNT( CASE id WHEN 'ID1' THEN 1 END ) > 0;

<强>输出

GROUP PERCENTAGE
----- ----------
    1        200
    2 16.6666667

如果您只想要IDID1的行只有一行,请将最后一行更改为:

HAVING   COUNT( CASE id WHEN 'ID1' THEN 1 END ) = 1;

您可能有一个ID1行的组,ID2行的总和为零(如果允许零或负值) - 查询将抛出一个{ {1}}例外。如果您想阻止这种情况发生,那么您可以使用:

ORA-01476: divisor is equal to zero