Нельзя использовать группу и более (раздел) в одном запросе?

У меня есть таблица myTable с 3 столбцами. col_1 — это INTEGER, а два других столбца – DOUBLE. Например, col_1={1, 2}, col_2={0.1, 0.2, 0.3}. Каждый элемент в col_1 состоит из всех значений col_2, а col_2 имеет повторяющиеся значения для каждого элемента в col_1. 3-й столбец может иметь любое значение, как показано ниже:

    col_1 | col_2 | Value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  2.0
    1     |  0.2  |  3.0
    1     |  0.3  |  4.0
    1     |  0.3  |  5.0
    2     |  0.1  |  6.0
    2     |  0.1  |  7.0
    2     |  0.1  |  8.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0

Я хочу использовать агрегатную функцию SUM() в разделе столбца Value по col_1 и сгруппированном по col_2. Таблица выше должна выглядеть так:

    col_1 | col_2 | sum_value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  5.0
    1     |  0.3  |  9.0
    2     |  0.1  |  21.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0

Я попробовал следующий SQL-запрос:

SELECT col_1, col_2, sum(Value) over(partition by col_1) as sum_value
from myTable
GROUP BY col_1, col_2

Но на DB2 v10.5 выдавало следующую ошибку:

SQL0119N  An expression starting with "Value" 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.

Не могли бы вы указать, что не так. У меня нет большого опыта работы с SQL.

Спасибо.


person user3557405    schedule 25.03.2015    source источник
comment
Какое отношение MySQL имеет к этому вопросу? (Не отмечайте продукты, которые не участвуют...)   -  person jarlh    schedule 25.03.2015


Ответы (2)


Да, вы можете, но вы должны быть последовательны в отношении уровней группировки. То есть, если ваш запрос является запросом GROUP BY, то в аналитической функции вы можете использовать только «подробные» столбцы из «неаналитической» части выбранных вами столбцов. Таким образом, вы можете использовать либо столбцы GROUP BY, либо неаналитические агрегаты, как в этом примере:

select product_id, company, 
sum(members) as No_of_Members, 
sum(sum(members)) over(partition by company) as TotalMembership 
From Product_Membership 
Group by Product_ID, Company

надеюсь, это поможет

SELECT col_1, col_2, sum(Value) over(partition by col_1) as sum_value
    -- also try changing "col_1" to "col_2" in OVER
from myTable
GROUP BY col_2,col_1 
person Dave    schedule 25.03.2015
comment
Я уже видел этот пример. Я могу сделать это таким образом, но тогда я получаю общую сумму для каждого элемента в col_1 вместо суммы для каждого отдельного элемента в col_2 для каждого элемента в col_1 - person user3557405; 25.03.2015
comment
У меня была такая же проблема, и Дэйв, ваш запрос дал мне именно то, что мне нужно. - person Sean Branchaw; 06.05.2016
comment
привет, хороший пример. Означает ли это, что секционированный столбец должен быть подмножеством сгруппированных по столбцам? И что означает sum(sum(? - person MJeremy; 18.08.2020

Я нашел решение.

Мне не нужно использовать OVER(PARTITION BY col_1), потому что он уже есть в предложении GROUP BY. Таким образом, следующий запрос дает мне правильный ответ:

SELECT col_1, col_2, sum(Value) as sum_value
from myTable GROUP BY col_1, col_2

так как я уже группирую по col_1 и col_2.

Дэйв, спасибо, я понял идею из твоего поста.

person user3557405    schedule 25.03.2015