2016-12-29 9 views
1

Я использую DB2 и есть две таблицы:SQL режим высчитывает DB2

пользователей:

  • ID - ключевые
  • Образование (целое значение представляет уровень)
  • Возраст

Платежи:

  • Магазин
  • Сумма
  • ID - внешний ключ

Я хочу, чтобы вычислить статистический режим обучения для каждого магазина, сейчас я пытаюсь что-то вроде этого: 1) Вычислить режим для магазина X :

select u.education    
    from users u, payments p 
    where u.id = p.id AND    
    p.shop = 'X'  
    group by u.education order by count(*) desc 
    fetch first 1 rows only;      

Этот запрос работает отлично

2) режим обучения Рассчитайте для каждого магазина:

select p.Shop as Shop,      
    avg(u.age) as AvgAge,          
    (select u1.education           
     from users u1          
     where u1.id = p.id         
     group by u1.education           
     order by count(*) desc           
     fetch first 1 rows only) as ModeEdu        
    from users u, payments p      
    where u.id = p.id          
    group by p.Shop;       

Этого запрос дает ошибку:

SQLCODE = -119, ошибка: столбец или выражение, намеченный в HAVING недействителен,

+0

Почему с возрастом входит в запрос? можете ли вы показать некоторые выборочные данные и ожидаемый результат? –

+0

@vkp Я включил возраст, потому что я также пытаюсь получить другую информацию о пользователях, но имею проблему с выбором способа обучения. – MRMKR

+0

@vkp какие образцы вы хотите увидеть? – MRMKR

ответ

0

Здесь вы идете. Я изменил синтаксис «современный». Синтаксис, который вы использовали, был «старым» 20 лет назад. I настоятельно рекомендую использовать новый синтаксис.

WITH eduCount AS 
(
    select u1.id, u1.education, count(*) as c 
    from users u1 
    group by u1.id u1.education           
), byUser AS 
( 
    select id, education, c, 
    ROW_NUMBER() OVER (PARTITION BY id, education ORDER BY c DESC) AS RN 
    from eduCount 
) 
select p.Shop as Shop,      
    avg(u.age) as AvgAge,          
    max(byUser.education) as ModeEdu 
from users u 
join payments p on u.id = p.id 
left join byUser on byUser.id = u1.id AND rn = 1 
group by p.Shop;   
+0

Я использую vista tn3270 и spufi для запуска запроса, это дает мне ошибку: SQLCODE = -104, ERROR: НЕЗАКОННЫЙ СИМВОЛ «ROW_NUMBER». НЕКОТОРЫЕ СИМВОЛЫ, КОТОРЫЕ МОГУТ БЫТЬ ЮРИДИЧЕСКИМИ: ИЗ ВХОДА В – MRMKR

+0

@MRMKR - У меня была опечатка – Hogan

+0

Теперь у меня проблемы с группой в eduCount, с eduCount AS (выберите u1.id, u1.education, count (*) as c из группы пользователей u1 по u1.id, u1.education), давая ошибку: U1.ID НЕ ДЕЙСТВИТЕЛЬНО В КОНТЕКСТЕ, ГДЕ ИСПОЛЬЗУЕТСЯ – MRMKR