在汇总选择查询中使用独特

时间:2018-10-29 15:10:13

标签: sql oracle group-by distinct

我正在使用oracle DB。我有一个汇总脚本。我们发现表中的某些行是重复的,不需要的,因此不应在总和中添加。

现在假设我在select语句之后使用Distinct命令,将在聚合之前或之后应用distinct命令。

2 个答案:

答案 0 :(得分:0)

如果使用SELECT DISTINCT,则结果集将没有重复的行。

如果使用SELECT COUNT(DISTINCT),则该计数将仅计数不同的值。

如果您正在考虑使用SUM(DISTINCT)(或将DISTINCT与其他任何聚合函数一起使用),请注意。我从未使用过它(也许只是作为示例),并且我编写了很多查询。

您真的需要从根本上解决问题。例如,如果要重复帐户,则SUM(DISTINCT)不会仅根据分配给该帐户的值来区分两个帐户。您需要弄清楚逻辑。

答案 1 :(得分:0)

当您说重复的行时-对于某些特定列的组合,必须清楚地知道唯一性。

如果您期望某些列组合在指定的组中是唯一的,则可以按照以下模式使用查询来检测与该组不同的组。

select <your group by columns> 
from <your table name> 
group by <your group by predicate>
having (max(A)!=min(A) or max(B)!=min(B) or max(C)!=min(C))

然后,您必须决定如何处理问题。我建议清理并向表中添加唯一约束。

您提到的汇总查询将针对表中的行成功运行,而这些表中的行不具有需要唯一的列组合的重复值。在我的示例中,您可以使用具有倒置的谓词获取该部分数据的汇总。

应该是这样

select <your aggregate functions, counts, sums, averages and so on> 
from <your table name> 
group by <your group by predicate>
having (max(A)=min(A) and max(B)=min(B) and max(C)=min(C)) 

如果必须包括打破唯一性期望的组,则必须以某种方式对组中要使用的哪个变体进行合格选择-例如,如果应该出现一个列,则可以选择最后一个或第一个表达有关何时创建行的信息。