SQL Server根据另一列对特定行数求和

时间:2017-06-26 15:45:48

标签: sql sql-server group-by sum

以下是我表格中的重要栏目

C:>DIR /B /A:D
R100_20170501_HF300_check1234
R200_20170621_HF122_TEST1234
R200_20170622_HF123_DF_25439
R300_20170622_HF99_DF_25439

C:>TYPE h.ps1
Get-ChildItem -Directory -Filter "*_HF*_*" |
    Where-Object { $_.Name -match '.*_HF([0-9]*)_.*' } |
    ForEach-Object { "$($matches[1])" } |
    Measure-Object -Maximum |
    ForEach-Object { $_.Maximum }

C:>powershell -NoProfile -File h.ps1
300

在ItemID增加到2之前,rowID增加到141.此循环重复约1.22亿行。

我需要以6的组为单位计算CalculatedNum字段。所以总和1-6,然后是7-12,等等。我知道最后我得到一个奇数。我可以丢弃最后三行(139,140和141号)。当我到达下一个ItemID时,我需要它再次启动SUM循环。

我知道我需要按ItemID进行分组,但是我一直在努力弄清楚如何将SQL一次只用6个CalculatedNum。基于值相同的列,我遇到的所有其他东西都是。

我确实在微软的网站上找到了一些使用ROW_NUMBER功能的东西,但我无法理解它。如果这个问题不明确,请告诉我。

谢谢

4 个答案:

答案 0 :(得分:2)

您需要按(RowId - 1)/ 6和ItemId进行分组。像这样:

async

答案 1 :(得分:1)

您可以使用整数除法和分组依据。

SELECT ItemId, (RowId-1)/6 as Batch, sum(CalculatedNum) 
FROM your_table GROUP BY  ItemId, Batch

丢弃不完整的批次:

SELECT ItemId, (RowId-1)/6 as Batch, sum(CalculatedNum), count(*) as Cnt
FROM your_table GROUP BY  ItemId, Batch HAVING Cnt = 6

编辑:修正了一个错误。

答案 2 :(得分:0)

为了确保您一次查询6行,您可以尝试使用模数函数:https://technet.microsoft.com/fr-fr/library/ms173482(v=sql.110).aspx

希望这可以提供帮助。

答案 3 :(得分:0)

谢谢大家。这真的很有帮助。

这是我们最终的目标。

SELECT ItemID, MIN(RowID) AS StartingRow, SUM(CalculatedNum)
FROM dbo.table
GROUP BY ItemID, (RowID - 1) / 6
ORDER BY ItemID, StartingRow

我不确定为什么它不喜欢select语句中的整数除法,但是我根据数据样本检查结果并且数学是正确的。