按行

时间:2015-10-15 19:24:06

标签: sql sql-server database

假设您在数据库中拥有这组记录:

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在相同的顺序中始终相同 * - 我可以有多个partnumber重复,即不仅B重复,而且所有这些都是PER GROUP

我知道我可以在表格中添加一个新列,如下所示:

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
从表组中选择partnumber,sum(qty)  但这正是我做不到的。有什么建议?

3 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分: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;

答案 2 :(得分: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