2015-03-25 31 views
7

Mam tabelę myTable z 3 kolumnami. col_1 to INTEGER, a pozostałe 2 kolumny to DOUBLE. Na przykład col_1={1, 2}, col_2={0.1, 0.2, 0.3}. Każdy element w col_1 składa się z wszystkich wartości col_2 i col_2 ma powtarzające się wartości dla każdego elementu w col_1. The 3rd kolumna może mieć dowolną wartość, jak pokazano poniżej:Nie można używać grup przez i po (partycja według) w tym samym zapytaniu?

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 

Co chcę jest użycie agregatów funkcję SUM() na partycji Value kolumny col_1 i pogrupowane według col_2. Powyższa tabela powinna wyglądać następująco:

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 

Próbowałem następujące zapytanie SQL:

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

Ale DB2 10.5 dało następujący błąd:

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. 

Można uprzejmie wskaż, co jest nie tak. Nie mam dużego doświadczenia z SQL.

Dziękuję.

+0

Co ma MySQL zrobić z pytaniem? (Nie oznaczaj produktów nie związanych ...) – jarlh

Odpowiedz

4

znalazłem rozwiązanie.

Nie trzeba używać OVER(PARTITION BY col_1), ponieważ jest już w klauzuli GROUP BY. Tak więc, następujące kwerendy daje mi właściwą odpowiedź:

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

ponieważ jestem już zgrupowanie w.r.t col_1 i col_2.

Dave, dzięki, mam pomysł ze swojego wpisu.

12

Tak, możesz, ale powinieneś zachować spójność w odniesieniu do poziomów grupowania. To znaczy, jeśli zapytanie jest zapytaniem GROUP BY, to w funkcji analitycznej można używać tylko kolumn "szczegółowych" z "nieanalizowanych" części wybranych kolumn . Zatem można użyć GROUP BY kolumn ani na non-analityczne kruszywa, jak w poniższym przykładzie:

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 

nadzieję, że pomoże

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

Już widziałem ten przykład. Mogę to zrobić w ten sposób, ale wtedy otrzymuję łączną sumę dla każdego elementu w 'col_1' zamiast sumy dla każdego odrębnego elementu w col_2 dla każdego elementu w col_1' – user3557405

+0

Zaktualizowałem odpowiedź, czy to działa? – Dave

+0

Miałem ten sam problem, a Dave, twoje zapytanie dało mi dokładnie to, czego potrzebowałem. –