2015-10-15 3 views
2

Допустим, у вас есть этот набор записей в базе данных:Группировка по номеру строки в колонке

PartNumber  Qty Group 
    A   1  1 
    B   2  1 
    C   3  1 
    B   4  1 
    a   1  2 
    B   2  2 
    C   3  2 
    B   4  2 

Как мы можем придумать с этим результатом:

A  2 
    B  4 
    C  6 
    B  8 

То есть, добавляя первая строка первой группы с первой строкой второй группы, вторая строка первой группы со второй строкой второй группы, третья строка первой группы с третьей строкой второй группы и так далее.

Примечание:
* - Я могу иметь кратные группы
* - Группы всегда будут иметь одинаковую длину (то есть такое же количество строк в группе)
* - В номерах изделий в группе всегда будут то же самое в том же порядке
* - Я могу иметь кратные PARTNUMBER повторение, то есть не только B повторить, но все из них на группу

Я знаю, что могу добавить новый столбец в таблице, чтобы иметь что-то вроде этого:

PartNumber Qty Group idx 
    A   1  1  1 
    B   2  1  2 
    C   3  1  3 
    B   4  1  4 
    a   1  2  1 
    B   2  2  2 
    C   3  2  3 
    B   4  2  4 

и: выберите номер части, сумму (кол-во) из группы таблицы по idx
, но это точно, что я не могу сделать. Какие-либо предложения?

+0

Какую версию sql-сервера вы используете? – JNevill

+0

@JNevill «Microsoft SQL Server 2008 R2 (SP3)» – 0aps

+1

Ваша таблица представляет собой просто неупорядоченный набор значений '(PartNumber, Qty, Group'. Следовательно, для каждой группы нет первой, второй и т. Д. Строк.Есть ли другой столбец, управляющий порядком в вашей таблице? –

ответ

2

Вы можете использовать ROW_NUMBER, чтобы создать поле idx, указанное в OP. Тогда его просто GROUP BY, чтобы получить желаемый результат:

SELECT PartNumber, SUM(Qty) 
FROM (
    SELECT PartNumber, Qty, 
      ROW_NUMBER() OVER (PARTITION BY [Group] ORDER BY id) AS idx 
    FROM mytable) AS t 
GROUP BY PartNumber, idx 
ORDER BY idx 

Группировка зависит от этого правила, указанным в OP:

В номерах изделий в группе всегда будет то же самое в том же порядке

Я считаю, что приведенное выше правило (№ 3) делает правило №. 2 избыточным.

+1

Быстрое sqlfiddle с этим решением: http://sqlfiddle.com/#!3/b659b/3 – JNevill

0

Таблицы SQL представляют неупорядоченные комплекты. Позвольте мне предположить, что есть другой столбец, который указывает порядок (qty выглядит как такой столбец, но, похоже, имеет другую цель).

С этой колонкой мы можем использовать row_number() и предполагая, что ваши условия действительно так, это становится простой агрегация запросы:

select min(PartNumber) as PartNumber, sum(qty) as qty 
from (select t.*, row_number() over (partition by group order by id) as seqnum 
     from t 
    ) t 
group by seqnum; 

Однако я предпочитаю эту версию, просто чтобы проверить номер детали:

select (case when min(PartNumber) = max(PartNumber) then min(PartNumber) 
      else 'Oops! Parts don''t match' 
     end) as PartNumber, sum(qty) as qty 
from (select t.*, row_number() over (partition by group order by id) as seqnum 
     from t 
    ) t 
group by seqnum; 
0

Это, кажется, работает нормально: -

with temptable as 
(
select 
    [PartNumber], 
    [Qty], 
    ROW_NUMBER() over(partition by [group] order by [group]) [idx] 
from #temp 
) 

select PartNumber, SUM(Qty) 
from temptable 
group by Partnumber, [idx] 

См. Скрипку http://sqlfiddle.com/#!3/cfa38/1

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