总和,重复的行

问题描述 投票:0回答:1

The tl / dr摘要:3个具有层次结构关系的表,一个中间级别的数字字段,需要该数字的总和而不由于较低级别而重复,因此在DB2中寻找使用OLAP函数的替代方法。

这在某种程度上重新审视了这两个主题(SUM(DISTINCT) Based on Other ColumnsSum Values based on Distinct Guids)-但是我作为一个单独的主题感到困惑,因为我想知道是否有一种方法可以使用OLAP函数来完成此任务。

我正在DB2中工作。该场景(由于客户端的机密性,不是实际的表)是:

   Table: NEIGHBORHOOD, field NEIGHBORHOOD_NAME
   Table: HOUSEHOLD, fields NEIGHBORHOOD_NAME, HOUSEHOLD_NAME, and HOUSEHOLD_INCOME
   Table: HOUSEHOLD_MEMBER, fields HOUSEHOLD_NAME, PERSON_NAME

现在,我们已经通过单个flat-it-all-view视图提取了数据。所以我们会得到类似

的东西
 Shady Acres, 123 Shady Lane, 25000, Jane
 Shady Acres, 123 Shady Lane, 25000, Mary
 Shady Acres, 123 Shady Lane, 25000, Robert
 Shady Acres, 126 Shady Lane, 15000, George
 Shady Acres, 126 Shady Lane, 15000, Tom
 Shady Acres, 126 Shady Lane, 15000, Betsy
 Shady Acres, 126 Shady Lane, 15000, Timmy

如果我想要

    Shady Acres, 123 Shady Lane, 25000, 3  (household income, count of members)
    Shady Acres, 125 Shady Lane, 15000, 4

没问题:

SELECT N.NEIGHBORHOOD_NAME, H.HOUSEHOLD_NAME, H.HOUSEHOLD_INCOME, count(1)
from NEIGHBORHOOD N join HOUSEHOLD H on N.HOUSEHOLD_NAME = H.HOUSEHOLD_NAME
join HOUSEHOLD_MEMBER M on H.HOUSEHOLD_NAME = M.HOUSEHOLD_NAME
group by N.NEIGHBORHOOD_NAME, H.HOUSEHOLD_NAME, H.HOUSEHOLD_INCOME

但是,如果我想

   Shady Acres, 2, 40000, 7 (i.e. neighborhood, number of households, sum of income, count of members)

如相关链接所示,如果没有子查询,我将无法完成它。

到目前为止,我得到的最好的是

select NEIGHBORHOOD.NEIGHBORHOOD_NAME,
count(distinct HOUSEHOLD.HOUSEHOLD_NAME) household_Count,
sum(distinct HOUSEHOLD.HOUSEHOLD_INCOME) total_income,
count(1) household_members group by N.NEIGHBORHOOD_NAME

当然,如果您有两个收入相同的家庭,这将不起作用。坦率地说,“ sum(distinct)”甚至有效,这让我感到很惊讶,因为这对我来说毫无意义。

我尝试过

sum(household_income) over (partition by household.household_name) 

它引发了错误:

An‬表达式”‬“开始”‬“‪with‬”‪‬“ HOUSEHOLD_INCOME”‬‪specified‬‪in‬‪a‬‪SELECT‪‪clause‬,‪‬‪ HAVING‬‪clause‬,‪‬‪or‪‪ORDER‬‪BY‬‪clause‬‪is‬‪not‬‪specified‬‪in‬‪the‪‪GROUP ‪BY‬‪clause‬‪or‬‪it‬‪is‬‪in‬‪a‬‪SELECT‪‪clause‬,‪‬‪HAVING‬‪clause‬, ‪‬‪or‬‪ORDER‬‪BY‬‪clause‬‪with‬‪a‬‪column‬‪function‬‪and‬‪no‬‪GROUP‬‪BY‬ ‪clause‬‪is‬‬specified‬.‪‬.‪‬‪SQLCODE‬=‪‬-‪119‬,‪‬‪SQLSTATE‬=‪42803‬,‪‬ ‪DRIVER‬=‪4‬.‪19‬.‪56

尝试将HOUSEHOLD_INCOME或HOUSEHOLD_NAME添加到分组会导致错误的结果,因为我们不想按这些字段进行分类。

除了使用子查询外,没有其他解决方案是完全有可能的,但是我们必须对基础视图进行一些重大的重新设计(包括添加其他视图),因此我认为问这个问题不会受到伤害。) >

tl / dr摘要:3个具有层次关系的表,在中间级别为数字字段,需要该数字的总和,但由于较低级别而没有重复,寻找替代项...

sum duplicates db2 olap partition
1个回答
0
投票
我同意,如果您想使用OLAP功能,那么没有子查询就不可能做到这一点
© www.soinside.com 2019 - 2024. All rights reserved.