2015-10-15 128 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 

也就是说,加入第一组的第一行与第二组的第一行,第一组的第二行与第二组的第二行,第一组的第三行与第二组的第三行,依此类推。

注:
* - I可以具有倍数组
* - 的基团将始终具有相同的长度(即,相同数目的行,每组的)
* - 该组中的partnumbers将始终是同样以相同的顺序
* - 我能有倍数部分号码重复,即不仅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 

和:从表格组中选择partnumber,sum(qty),idx
但这正是我无法做到的。有什么建议么?

+0

你使用的是什么版本的sql-server? – JNevill

+0

@JNevill“Microsoft SQL Server 2008 R2(SP3)” – 0aps

+1

你的表只是一个'(PartNumber,Qty,Group')值的无序集合,因此每个组没有第一行,第二行等。在你的桌子中是否有另一个列管理命令? –

回答

2

您可以使用ROW_NUMBER创建您在OP中提到的idx字段。然后它的一个简单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表示:

组中的partnumbers将始终以相同的顺序相同

我相信上述规则(第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