在存储过程中分组和循环

时间:2018-07-07 09:32:32

标签: sql sql-server stored-procedures

我需要对MTH1,MTH2等列进行求和,但是对于我传递的参数,它将为同一帐户代码生成六行信息,这是正确的,并且应该产生的问题是我怎么只返回一个数据,但加上六行的总和,这就是我到目前为止对存储过程的了解。

ALTER PROCEDURE [dbo].[sumbalances] 
    @AccountRef VARCHAR(500),
    @SortOrder INT,
    @CATEGORY INT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT        
        NOMINAL_LEDGER.ACCOUNT_REF, NOMINAL_LEDGER.NAME, 
        NOMINAL_LEDGER.ACCOUNT_TYPE, NOMINAL_LEDGER.BALANCE, 
        NOMINAL_LEDGER.QUICK_RATIO, NOMINAL_LEDGER.SOFA_ID, 
        NOMINAL_LEDGER.PRIOR_YR_MTH1, NOMINAL_LEDGER.PRIOR_YR_MTH2, 
        NOMINAL_LEDGER.PRIOR_YR_MTH3, NOMINAL_LEDGER.PRIOR_YR_MTH4, 
        NOMINAL_LEDGER.PRIOR_YR_MTH5, NOMINAL_LEDGER.PRIOR_YR_MTH6, 
        NOMINAL_LEDGER.PRIOR_YR_MTH7, NOMINAL_LEDGER.PRIOR_YR_MTH8, 
        NOMINAL_LEDGER.PRIOR_YR_MTH9, NOMINAL_LEDGER.PRIOR_YR_MTH10, 
        NOMINAL_LEDGER.PRIOR_YR_MTH11, NOMINAL_LEDGER.PRIOR_YR_MTH12, 
        NOMINAL_LEDGER.PRIOR_YR2_MTH1, NOMINAL_LEDGER.PRIOR_YR2_MTH2, 
        NOMINAL_LEDGER.PRIOR_YR2_MTH3, 
    FROM            
        CATEGORY 
    LEFT JOIN
        NOMINAL_LEDGER ON CATEGORY.CompanyID = NOMINAL_LEDGER.CompanyID
    WHERE 
        ACCOUNT_REF = @AccountRef 
        AND SORT_ORDER = @SortOrder 
        AND CATEGORY = @CATEGORY
END

我认为我需要某种循环来将所有MTH1的和保存下来,或者不需要那么复杂。

下面是数据示例。

enter image description here

例如,如果它是第1个,它将添加

40000.00
44000.00

并在MTH 1列中返回该总数,但如果从那以后求和,则只对所有它们的一行进行累加。

编辑2

请在这里查看我的sql小提琴,如果有人可以帮忙,我在链接类别表时会遇到一些麻烦。但这不是上面的主要问题,所以你们可以看到数据

http://sqlfiddle.com/#!18/6c902/1

1 个答案:

答案 0 :(得分:1)

您似乎只想要GROUP BY。但是您还可以通过其他方式简化查询:

select nl.ACCOUNT_REF, 
    sum(nl.PRIOR_YR_MTH1) as PRIOR_YR_MTH1,
    sum(nl.PRIOR_YR_MTH2) as PRIOR_YR_MTH2,
    . . .  - fill in the rest of the months
from NOMINAL_LEDGER nl join         
     CATEGORY c
     on c.CompanyID = nl.CompanyID
where nl.ACCOUNT_REF = @AccountRef and
      nl.SORT_ORDER = @SortOrder and
      c.CATEGORY = @CATEGORY
group by nl.ACCOUNT_REF;

注意:

  • WHERE子句(大概)撤消LEFT JOIN,将其变成INNER JOIN。因此,请使用正确的JOIN
  • 表别名使查询更容易读写。
  • 您似乎想要每个帐户一行,因此查询按帐户汇总,而忽略其他未汇总的列。