2013-07-28 1 views
-3

У меня есть таблица, как это:SELECT/GROUP BY - последовательность значения

CREATE TABLE tbltest (
    Col1   Integer(10) UNSIGNED, 
    Col2   Integer(10) UNSIGNED 
) 

есть значение выборки:

Col1 Col2 
--------- 
1  1 
2  1 
3  1 
4  1 
5  1 

6  2 
7  2 
8  2 
9  2 
10 2 

11 1 
12 1 
13 1 
14 1 
15 1 

Хочет SELECTSUM(col1)GROUPBY значений последовательности из col2 не по всем значениям. С результатами выше данных, как это:

col1 col2 
--------- 
15 1 
40 2 
75 1 

Я не имею ни малейшего представления, как запрос будет похож. Также простите меня за этот плохой титул. Я не знаю, как это следует назвать.

Благодаря

+2

, как вы получили 30 и 78? как мы можем понять, если вы не опишите? –

+0

Вы уверены, что это не * 40 *? (6. + 7 + 8 + 9 + 10) – Bohemian

ответ

2

Немного сложной версии в связи с отсутствием аналитических функций в MySQL; Я предполагаю, что это SUM из val1 вам нужно;

SELECT SUM(val1) val1, MAX(val2) val2 
FROM (
    SELECT s1.val1, COUNT(s3.val1) grouping, s1.val2 val2 
    FROM sequence s1 
    LEFT JOIN sequence s2 ON s1.val1 >= s2.val1 
    LEFT JOIN sequence s3 ON s3.val1 = s2.val1 - 1 AND s2.val2 <> s3.val2 
    GROUP BY s1.val1 
) a 
GROUP BY grouping 
ORDER BY grouping 

An SQLfiddle to test with.

Если добавить grouping в список выбора, чтобы сделать заказ очевидно, вы получите

val1 val2 grouping 
15  1  0 
40  2  1 
65  1  2 
+0

Работало. Большое спасибо. Но это так сложно. Можете ли вы дать мне больше информации? – SAMPro

+1

@SAMPro Внутренний select в основном просто строка за строкой подсчитывает предыдущие изменения в 'val2' (вы можете запускать внутренний запрос сам по себе, чтобы увидеть, что он делает), и внешние группы выбора с помощью этого номера изменения, чтобы получить конечный результат. –

0

попробовать это

select sum(val1) as val1, val2 from table1 
    group by val2 
1

Вам нужно будет использовать функцию SUM() и GROUB BY.

Итак, чтобы получить ответ, который вы ищете

Ближайшие я могу получить без добавления других столбцов:

SELECT SUM(val1) as total1, val2 FROM table_name 
GROUB BY table_name.val2 

Результат:

total1 val2 
--------- 
93 1 
30 2 

Вам может понадобиться из третьей колонки доступный, что делает эти три группы такими, как

val1 val2 val3(new) 
--------------- 
1 1 1 
2 1 1 
3 1 1 
... .. .. 
6 2 2 
7 2 2 
... .. .. 
11 1 3 
12 1 3 
... .. .. 
15 1 3 

Тогда ваш SQL-запрос будет выглядеть так:

SELECT SUM(val1) as total2, val2 FROM table_name 
GROUB BY table_name.val2, table_name.val3 

Результат:

total1 val2 
--------- 
15 1 
30 2 
78 1 

Ссылаясь на enter link description here

+0

Добро пожаловать, и да, ты прав. Но есть ли какое-либо решение, которое не нуждается в колонке третей? – SAMPro

+0

Не без разделения трех групп по-другому. Рассматривая данные в исходной таблице, информация группируется по 5 значений. Это что-то такое случайно или специально? Если это так, вы можете воспользоваться, зная это о своем наборе данных. – lombaardcj