不同且唯一列值的SUM

时间:2014-03-31 07:13:53

标签: mysql sql oracle11g oracle-sqldeveloper

site      device      site_count    
=================================
1           AB1          45            
1           AB2          45            
1           AB3          45            
1           AB4          45            
1           AB5          45            
2           AB6          70            
2           AB7          70            
2           AB8          70            
3           AB9          100           
3           A10          100           
4           A11          10   

以下总和(site_count)是通过添加唯一网站的网站计数值获得的,即45 + 70 + 100 + 10 = 225(无论网站出现的次数如何)。

site      device      site_count     sum(site_count)
====================================================
1           AB1          45            225
1           AB2          45            225
1           AB3          45            225
1           AB4          45            225
1           AB5          45            225
2           AB6          70            225
2           AB7          70            225
2           AB8          70            225
3           AB9          100           225
3           A10          100           225
4           A11          10            225

您是否可以发布查询以在一个查询中获取总和(site_count)和其他列值。结果集显示在上面。

1 个答案:

答案 0 :(得分:1)

你可以在总和上使用distinct:

select site, device, site_count, sum(distinct site_count) over ()
from mytable;

编辑:当然你可以在没有窗口功能的情况下做同样的事情,但这可能会更慢:

select site, device, site_count, (select sum(distinct site_count) from mytable)
from mytable;

新编辑:我误读了您的请求。在下面的评论中,您已经解释过您不是在寻找不同的网站数量,而只是查找所有网站上的网站数量总和。所以这是对我的回答的更新。

不幸的是,您没有一个用于站点的表和一个用于设备的表,就像您应该的那样,但只有一个表用于保存站点的设备冗余计数。你应该改变它。说到这一点,当然即使像你这样的不利数据模型,仍然可以选择数据。这只是一点点工作。

每个网站需要一次网站计数。因此,按站点分组并获取最小值,最大值或平均站点数 - 它们应该与冗余存储的值相同。然后总结这些网站数量:

select site, device, site_count, 
(
  select sum(distinct_site_count) 
  from
  (
    select min(site_count) as distinct_site_count from mytable group by site
  )
)
from mytable;

或更紧凑:

select site, device, site_count, 
  (select sum(min(site_count)) from mytable group by site)
from mytable;