2011-03-15 56 views
0

前提:我们有一个包含5个字段的表。 2个字段总是唯一的。基于条件计数的SQL查询(可以包含pl/sql位)

什么是履行一个很好的办法:

如果(count_of_result == 3){ 来自同一个表中添加了3行。将唯一值加起来&假设所有3行的非唯一值都相同。 查询结果应显示1行,并将值加起来。 } else {

像往常一样显示查询的所有结果。

}

谢谢。

+0

阅读有关如何使用'GROUP BY'和'SUM(场)'函数。 – 2011-03-15 07:27:41

+0

'SELECT a,b,c,SUM(d),SUM(e)FROM tableT GROUP BY a,b,c;',其中'd,e'是唯一字段。 – 2011-03-15 07:30:11

+0

听起来不错。 “计数条件”如何,我们需要在计数小于或等于3的情况下才能完成总计和小组。 – radeon 2011-03-15 07:42:07

回答

0

有可能是这更有效的方法:

SELECT a,b,c, SUM(d) AS d, SUM(e) AS e 
    FROM tableT 
    WHERE (SELECT COUNT(*) FROM tableT) <= 3 
    GROUP BY a,b,c 
UNION ALL 
SELECT a,b,c,d,e 
    FROM tableT 
    WHERE (SELECT COUNT(*) FROM tableT) > 3 
; 
+0

甜美!这似乎非常完美。谢谢 – radeon 2011-03-15 14:40:48

0
select a, b, c, sum(d), sum(e) from (
    select a, b, c, 
      case count(*) over(partition by a, b, c) 
      when 3 then null else rownum end as group_controller 
    from tableT 
) group by a, b, c, group_controller; 

我认为这应该有效。内联视图中包含的分析函数确定组中是否会有正好3行(不含聚合)。外部查询的group by需要do_group在应该执行分组的情况下为空(或任何常数值)(因此推迟到用于分组的&b),或者在分组应该被中和时的唯一值(rownum在此会很好地完成情况)。

+0

谢谢你的详细解答,我觉得这很接近最终的解决方案。但是,是不是“特定于t-sql的”分区“?另外,总和(d)和总和(e)是否在给定的解决方案中起作用? – radeon 2011-03-15 08:58:35