2017-08-07 7 views
0

をフィールドを集約するために、私は次のように3つのテーブルを結合しBQLクエリを持っている:どのように複雑なクエリの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)) 

私は1つの集約フィールドを追加したい、つまりGLTran.CuryDebitAmtの合計がGLTranによってグループ化.BatNbrとBranch.BranchCD。

次のように私は簡単に機能OVER SUMを使用して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

あなたがPXSelectGroupByを使用し、BQLのためのあなたのAggreateであろう「SUM」、その値をフィールドを示します。呼び出されなかったフィールドはすべてMAX値になります。

あなたがBQL例をたくさん見つけることができますAcumaticaソースにSUM<を検索する場合。ここにはARPaymentEntryのBQLの例があります。他のすべてのフィールドがMAXになります返されながら、2つだけ(curyAdjdAmt & adjAmt)フィールドは、SUMが含まれます。

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); 

あなたの質問のための別の代替ソリューションは、あなたが、あなたの通常の選択であなたのBQLでベーステーブル対プロジェクションテーブルを含めるグループの値によって加算することができPXProjectionを作成することです。パフォーマンスの利点がどちらか一方であるかどうかはわかりません。もう1つの選択肢です。

+0

おかげで、ブレンダン..; D – pmfith