我有这张桌子:
╔═════╤═══════╤═══════╗
║ 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 ║
╚═════╧═══════╧═══════╝
我想做以下事情:
ID1仅在Group1和Group2中找到。因此ID2的平均值 组1 =(5 + 4 + 6)/ 3 = 5
和Group2 =(7 + 8 + 3)/ 3 = 6
组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'
非常感谢任何帮助。
答案 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
如果您只想要ID
为ID1
的行只有一行,请将最后一行更改为:
HAVING COUNT( CASE id WHEN 'ID1' THEN 1 END ) = 1;
您可能有一个ID1
行的组,ID2
行的总和为零(如果允许零或负值) - 查询将抛出一个{ {1}}例外。如果您想阻止这种情况发生,那么您可以使用:
ORA-01476: divisor is equal to zero