【问题标题】:SUM of distinct and unique column values不同且唯一的列值的总和
【发布时间】:2014-05-10 10:30:40
【问题描述】:
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) 和其他列值。结果集显示在上面。

【问题讨论】:

  • 我尝试了窗口功能,但它总计为 600,即所有站点计数的总和。无法根据不同的站点获得总和
  • 任何帮助@sql 朋友...
  • 不完全确定您想要达到什么目的。请您发布您预期结果集的示例吗?即有总计的单行?
  • @Sarin 在上面的问题中,第一个数据网格是我的源表....第二个数据网格是我预期的查询输出。我的输出应该提供基于唯一站点的总和。例子。站点 1 的计数为 45,尽管它重复了 4 次,但总和应将其视为一个。站点 2、3、4 的总和应为 45+70+100+10 基于站点的唯一性的唯一站点计数。跨度>
  • 我无法根据输出构建查询。

标签: mysql sql oracle11g oracle-sqldeveloper


【解决方案1】:

您可以在 sum 上使用 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;

【讨论】:

  • 这两个语句中的哪一个不起作用?你得到什么错误?这两种说法对我来说都是正确的。 AFAIK 第一个不适用于 MySQL,因为 MySQL 不支持窗口函数。但它应该在 Oracle 11g 中工作。第二个语句应该在两个 dbms 中都有效。
  • 请参阅@Thorsten 问题是您现在使用了不同的 site_count,例如,如果站点 A 的值是 45,站点 C 现在在这两个 45 中具有值 45(它们是不同的,因为它们属于两个不同的站点)您的两个查询只需要 45 一次。现在清楚了吗。我很乐意这样做:从mytable中选择站点,设备,站点计数,总和(不同站点计数)超过();但只要它满足我上面提到的问题。希望你明白我要指出的问题。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多