2015-03-25 2 views
7

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

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 

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

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.

спасибо.

+0

Что может сделать MySQL с вопросом? (Не помещайте продукты, которые не участвуют ...) – jarlh

ответ

4

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

Мне не нужно использовать 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 

, так как я уже группируя w.r.t col_1 и col_2.

Дэйв, спасибо, у меня появилась идея с вашего поста.

12

Да, вы можете, но вы должны быть последовательны в отношении уровней группировки. То есть, если ваш запрос является запросом 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(also try changing this to "col_2"))) as sum_value 
from myTable 
GROUP BY col_2,col_1 
+0

Я уже видел этот пример. Я могу сделать это таким образом, но затем я получаю общую сумму для каждого элемента в 'col_1' вместо суммы для каждого отдельного элемента в' col_2' за элементы в 'col_1' – user3557405

+0

Обновлен мой ответ, посмотрите, работает ли это? – Dave

+0

У меня была такая же проблема, и Дэйв, ваш запрос дал мне именно то, что мне было нужно. –

Смежные вопросы