2015-03-25 24 views
7

Ho una tabella myTable con 3 colonne. col_1 è un INTEGER e le altre 2 colonne sono DOUBLE. Ad esempio, col_1={1, 2}, col_2={0.1, 0.2, 0.3}. Ogni elemento in col_1 è composto da tutti i valori di col_2 e col_2 ha valori ripetuti per ciascun elemento in col_1. Il 3 ° colonna può avere qualsiasi valore come illustrato di seguito:Non è possibile utilizzare il gruppo più e più volte (partition by) nella stessa query?

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 

Quello che voglio è quello di utilizzare un aggregato funzione SUM() sulla partizione Value colonna col_1 e raggruppati per col_2. La tabella qui sopra dovrebbe essere simile a questo:

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 

ho provato la seguente query SQL:

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

Ma su DB2 v10.5 ha dato il seguente errore:

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. 

Can voi indicare gentilmente cosa è sbagliato. Non ho molta esperienza con SQL.

Grazie.

+0

Che cosa ha a che fare MySQL con la domanda? (Non taggare prodotti non coinvolti ...) – jarlh

risposta

4

ho trovato la soluzione.

Non è necessario utilizzare OVER(PARTITION BY col_1) perché è già nella clausola GROUP BY. Così, la seguente query mi dà la risposta giusta:

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

dal momento che sto già raggruppando w.r.t col_1 e col_2.

Dave, grazie, ho avuto l'idea dal tuo post.

12

Sì, è possibile, ma si dovrebbe essere coerenti con i livelli di raggruppamento. In altre parole, se la query è una query GROUP BY, in una funzione analitica è possibile utilizzare solo colonne "dettagli" dalla parte "non analitica" delle colonne selezionate . Così, è possibile utilizzare il GROUP BY colonne o gli aggregati non analitiche, come in questo esempio:

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 

Speranza che aiuta

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

Ho già visto quell'esempio. Posso farlo in questo modo ma poi ottengo la somma totale per ogni elemento in 'col_1' invece della somma per ogni elemento distinto in' col_2' per elementi in 'col_1' – user3557405

+0

Aggiornato la mia risposta, vedi se funziona? – Dave

+0

Ho avuto lo stesso problema e Dave, la tua domanda mi ha dato esattamente quello di cui avevo bisogno. –