如何在BQL中聚合字段以进行复杂查询

时间:2017-08-07 16:49:29

标签: acumatica

我有一个BQL查询连接三个表,如下所示:

foreach (PXResult<GLTran, Branch, xTACOpenSourceDetail> rec in
                                PXSelectJoin<GLTran,
                                             InnerJoin<Branch,
                                                 On<GLTran.branchID, Equal<Branch.branchID>>,
                                             InnerJoin<xTACOpenSourceDetail,
                                                 On<Branch.branchCD, Equal<xTACOpenSourceDetail.string03>,
                                                 And<xTACOpenSourceDetail.openSourceName, Equal<Constants.openSourceName>,
                                                 And<xTACOpenSourceDetail.dataID, Equal<Constants.privateer>>>>>>,
                                        Where<Branch.branchCD, NotEqual<Required<Branch.branchCD>>,
                                        And<GLTran.posted, Equal<True>,
                                        And<GLTran.ledgerID, Equal<Required<GLTran.ledgerID>>,
                                        And<GLTran.tranDate, GreaterEqual<Required<GLTran.tranDate>>>>>>,
                                        OrderBy<Asc<xTACOpenSourceDetail.string01, Asc<GLTran.batchNbr>>>>.Select(Base, osdBranch.String03, ledger.LedgerID, tacsmlm.Date01))

我想添加一个聚合字段,即按GLTran.BatNbr和Branch.BranchCD分组的GLTran.CuryDebitAmt的总和。

我可以使用SUM OVER功能在SQL中轻松完成此操作,如下所示:

SELECT  SUM(GLTran.CuryDebitAmt) OVER (PARTITION BY GLTran.BatchNbr, Branch.BranchCD) as 'BatchTotal'
       ,GLTran.*
       ,Branch.*
       ,xTACOpenSourceDetail.*

FROM    GLTran
        Inner Join Branch
            On GLTran.branchID = Branch.branchID
            AND Branch.CompanyID = GLTran.CompanyID
        Inner Join xTACOpenSourceDetail
            On Branch.branchCD = xTACOpenSourceDetail.string03
            And xTACOpenSourceDetail.openSourceName = 'TAC FM Map Company Branch'
            And xTACOpenSourceDetail.dataID = 'Privateer'
            AND xTACOpenSourceDetail.CompanyID = GLTran.CompanyID


Where   Branch.branchCD <> '000 0000'
        And GLTran.posted = 1
        And GLTran.ledgerID = 6
        And GLTran.tranDate >= '08/03/2017'
        AND GLTran.CompanyID = 2

Order
By      xTACOpenSourceDetail.string01 ASC
        ,GLTran.batchNbr ASC

...但我不知道如何在BQL中添加这个单一的求和字段。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您将使用PXSelectGroupBy并在您的Aggreate中为BQL指示哪些字段将“SUM”其值。任何未被调用的字段都是MAX值。

如果您在Acumatica源中搜索SUM<,您可以找到大量的BQL示例。这是来自ARPaymentEntry的BQL示例。只有两个(curyAdjdAmt&amp; adjAmt)字段将包含SUM,而返回的所有其他字段将为MAX。

SOAdjust other = PXSelectGroupBy<SOAdjust,
    Where<SOAdjust.voided, Equal<False>,
        And<SOAdjust.adjdOrderType, Equal<Required<SOAdjust.adjdOrderType>>,
        And<SOAdjust.adjdOrderNbr, Equal<Required<SOAdjust.adjdOrderNbr>>,
        And<
            Where<SOAdjust.adjgDocType, NotEqual<Required<SOAdjust.adjgDocType>>, 
            Or<SOAdjust.adjgRefNbr, NotEqual<Required<SOAdjust.adjgRefNbr>>>>>>>>,
    Aggregate<GroupBy<SOAdjust.adjdOrderType,
        GroupBy<SOAdjust.adjdOrderNbr, 
        Sum<SOAdjust.curyAdjdAmt, 
        Sum<SOAdjust.adjAmt>>>>>>.Select(this, adj.AdjdOrderType, adj.AdjdOrderNbr, adj.AdjgDocType, adj.AdjgRefNbr);

您的问题的另一个替代解决方案是创建一个PXProjection,它可以是按组值的总和,然后您在常规选择中包括投影表与BQL中的基表。我不知道其中一个或另一个的性能优势 - 只是另一个选择。