Сводка tl / dr : 3 таблицы с иерархическими отношениями, числовое поле на среднем уровне, нуждаются в сумме этого числа без дублирования из-за более низкого уровня, ища альтернативу с использованием функций OLAPв DB2.
Это несколько пересматривает эти две темы ( SUM (DISTINCT), основанные на других столбцах и Суммарные значения, основанные на различных направляющих ) - но я сталкиваюськак отдельная тема, потому что мне интересно, есть ли способ сделать это с помощью функций 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
Сейчас у нас есть данные, извлеченные одним представлением сглаживания всего. Таким образом, мы получили бы что-то вроде
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(household_income) over (partition by household.household_name)
, и он выдал ошибку:
Выражение, начинающееся с«HOUSEHOLD_INCOME», указанный в предложении SELECT, предложении HAVING или ORDERПредложение BY не указано в предложении GROUP BY илиВ предложении SELECT, предложении HAVING или предложении ORDER BYс функцией столбца и без указания предложения GROUP BY. SQLCODE = -119, SQLSTATE = 42803, DRIVER = 4 .19 .56
Попытка добавить в группу HOUSEHOLD_INCOME или HOUSEHOLD_NAME приводит к неверным результатам, поскольку мы не хотим разбивать их по этим полям.
Вполне возможно, что нет никакого решения для этого, кроме использования подзапроса, но нам пришлось бы сделать значительный редизайн базового представления (включая добавление дополнительных представлений), поэтому я решил, что это не повредитспросить.