假设您在数据库中拥有这组记录:
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)
但这正是我做不到的。有什么建议?
答案 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]