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