2014-03-31 60 views
0
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(不论无次站点出现)。SUM不同且唯一的列的值

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)和其他列值在一个单一的查询。结果集显示在上方。

+0

窗口函数 –

+0

我试过窗口的功能,但它总结了600这是所有网站的计数总和。无法根据不同的网站获得总和 –

+0

任何帮助@sql好朋友... –

回答

1

你可以和使用不同的:

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; 
+0

不工作@Thorsten Kettner –

+0

这两个语句中的哪一个不起作用?你会得到什么错误?这两个陈述看起来都是对的。 AFAIK第一个不适用于MySQL,因为MySQL不支持窗口功能。但它应该在Oracle 11g中运行。第二个声明应该可以在两个dbms中工作。 –

+0

请参阅@Thorsten问题,现在我已经采取了不同的site_count,例如,如果站点A的值为45,站点C的值为45,则这两个45中的值不同(它们是不同的,因为它们属于两个不同站点),您的两个查询都将只有45次只有一次。现在清楚了吗?我很高兴与此:选择网站,设备,site_count,总和(不同site_count)在() 从mytable;但前提是它符合我上面提到的问题。希望你得到了我指出的问题。 –