具有不同主键列和汇总功能的分组依据

时间:2020-06-11 14:37:28

标签: sql sql-server

我在SQL Server中有以下查询:

SELECT A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
      ,A.ANNUAL_STATEMENT_ID
      ,CASE WHEN DP_GROSS_DEPOSIT > 0 THEN DP_DEPOSIT_DATE
                  ELSE A.VALUATION_DATE 
         END AS VALUATION_DATE
         ,case when DP_GROSS_DEPOSIT < 0 THEN DP_GROSS_DEPOSIT
          when DP_GROSS_DEPOSIT > 0 THEN DP_GROSS_DEPOSIT
         WHEN DP_CURRENT_INTEREST_AMOUNT> 0 THEN DP_CURRENT_INTEREST_AMOUNT
         WHEN WD_GROSS_WITHDRAWAL>0 THEN WD_GROSS_WITHDRAWAL * -1
         WHEN IN_CURRENT_INTEREST_AMOUNT>0 THEN IN_CURRENT_INTEREST_AMOUNT
         ELSE 0
         END AS MPR
      ,B.IN_CURRENT_INTEREST_RATE AS IN_CURRENT_INTEREST_RATE
      ,IN_CURRENT_INTEREST_AMOUNT
      ,DP_GROSS_DEPOSIT
      ,0.00 DP_CURRENT_INTEREST_AMOUNT
      ,DP_DEPOSIT_DATE
      ,WD_GROSS_WITHDRAWAL 
      FROM PANST_ANNUAL_STATEMENT_MPR_ACTIVITY AS A
        INNER JOIN (select C.VALUATION_DATE, C.ANNUAL_STATEMENT_ID, MAX(C.IN_CURRENT_INTEREST_RATE) "IN_CURRENT_INTEREST_RATE" 
                          from (SELECT DISTINCT A.VALUATION_DATE, A.ANNUAL_STATEMENT_ID, B.IN_CURRENT_INTEREST_RATE, A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                              FROM PANST_ANNUAL_STATEMENT_MPR_ACTIVITY AS A
                              INNER JOIN (  SELECT DISTINCT IN_CURRENT_INTEREST_RATE, ANNUAL_STATEMENT_ID, VALUATION_DATE, BENEFIT_SEQ, DP_GROSS_DEPOSIT, ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                                                  FROM  PANST_ANNUAL_STATEMENT_MPR_ACTIVITY 
                                                  WHERE ANNUAL_STATEMENT_ID = 168811 
                                                  AND (IN_CURRENT_INTEREST_AMOUNT > 0 
                                                  OR DP_GROSS_DEPOSIT > 0 
                                                  OR WD_GROSS_WITHDRAWAL > 0)) AS B ON A.ANNUAL_STATEMENT_ID = B.ANNUAL_STATEMENT_ID AND A.VALUATION_DATE = B.VALUATION_DATE AND A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID = B.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                          WHERE A.ANNUAL_STATEMENT_ID = 168811) AS C
                          GROUP BY C.VALUATION_DATE, C.ANNUAL_STATEMENT_ID ) AS B ON A.VALUATION_DATE=B.VALUATION_DATE
                                                                                                      AND A.ANNUAL_STATEMENT_ID=B.ANNUAL_STATEMENT_ID
                                                                                                      --AND A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID = B.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
WHERE A.ANNUAL_STATEMENT_ID = 168811 AND ((IN_CURRENT_INTEREST_AMOUNT > 0 AND 
B.VALUATION_DATE > 20190220)
OR (DP_DEPOSIT_DATE  >= 20190220) OR WD_GROSS_WITHDRAWAL > 0) 

UNION SELECT A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
      ,A.ANNUAL_STATEMENT_ID
      ,CASE WHEN DP_GROSS_DEPOSIT > 0 THEN DP_DEPOSIT_DATE
                  ELSE A.VALUATION_DATE 
            END AS VALUATION_DATE
        ,case when DP_GROSS_DEPOSIT < 0 THEN DP_GROSS_DEPOSIT
          when DP_GROSS_DEPOSIT > 0 THEN DP_GROSS_DEPOSIT
         WHEN DP_CURRENT_INTEREST_AMOUNT> 0 THEN DP_CURRENT_INTEREST_AMOUNT
         WHEN WD_GROSS_WITHDRAWAL>0 THEN WD_GROSS_WITHDRAWAL * -1
         WHEN IN_CURRENT_INTEREST_AMOUNT>0 THEN IN_CURRENT_INTEREST_AMOUNT
         ELSE 0
         END AS MPR
        
      ,B.IN_CURRENT_INTEREST_RATE AS IN_CURRENT_INTEREST_RATE
      ,IN_CURRENT_INTEREST_AMOUNT
      ,0.00 DP_GROSS_DEPOSIT
      ,DP_CURRENT_INTEREST_AMOUNT
      ,DP_DEPOSIT_DATE
      ,WD_GROSS_WITHDRAWAL 
      FROM PANST_ANNUAL_STATEMENT_MPR_ACTIVITY AS A
        INNER JOIN (select C.VALUATION_DATE, C.ANNUAL_STATEMENT_ID, MAX(C.IN_CURRENT_INTEREST_RATE) "IN_CURRENT_INTEREST_RATE" 
                          from (SELECT DISTINCT A.VALUATION_DATE, A.ANNUAL_STATEMENT_ID, B.IN_CURRENT_INTEREST_RATE, A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                              FROM PANST_ANNUAL_STATEMENT_MPR_ACTIVITY AS A
                              INNER JOIN (  SELECT DISTINCT IN_CURRENT_INTEREST_RATE, ANNUAL_STATEMENT_ID, VALUATION_DATE, BENEFIT_SEQ, DP_GROSS_DEPOSIT, ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                                                  FROM  PANST_ANNUAL_STATEMENT_MPR_ACTIVITY 
                                                  WHERE ANNUAL_STATEMENT_ID = 168811 
                                                  AND (IN_CURRENT_INTEREST_AMOUNT > 0 
                                                 -- OR DP_GROSS_DEPOSIT > 0 
                                                  OR WD_GROSS_WITHDRAWAL > 0)) AS B ON A.ANNUAL_STATEMENT_ID = B.ANNUAL_STATEMENT_ID AND A.VALUATION_DATE = B.VALUATION_DATE AND A.ANNUAL_STATEMENT_MPR_ACTIVITY_ID = B.ANNUAL_STATEMENT_MPR_ACTIVITY_ID
                          WHERE A.ANNUAL_STATEMENT_ID = 168811) AS C
                          GROUP BY C.VALUATION_DATE, C.ANNUAL_STATEMENT_ID ) AS B ON A.VALUATION_DATE=B.VALUATION_DATE
                                                                                                      AND A.ANNUAL_STATEMENT_ID=B.ANNUAL_STATEMENT_ID
      WHERE A.ANNUAL_STATEMENT_ID = 168811 AND ((IN_CURRENT_INTEREST_AMOUNT > 0 AND 
      B.VALUATION_DATE > 20190220)
      OR (DP_CURRENT_INTEREST_AMOUNT > 0 AND DP_DEPOSIT_DATE  >= 20190220) OR WD_GROSS_WITHDRAWAL > 0)

此查询产生以下结果:

enter image description here

和我想要的结果集应该像这样:

enter image description here

在计算SUM(MPR)和SUM(DP_GROSS_DEPOSIT)列之后,每个VALUATION_DATE列值都应该只有一行,并且ANNUAL_STATEMENT_MPR_ACTIVITY_ID列值应取为MAX(MPR)。我尝试了很多,但我认为这是不可能的。我说的对吗?

1 个答案:

答案 0 :(得分:1)

如果两个突出显示的记录不是来自同一联合部分(一个来自联合上面的选择,另一个来自联合下面的选择),则将聚合函数添加到每个查询中将不起作用。考虑删除并集,并在一个select语句中组合这两个条件,或者在该语句周围包装CTE,然后对该结果进行汇总。

<div class="example-container mat-elevation-z8">
  <mat-table #table [dataSource]="dataSource">

    <mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>

    <ng-container matColumnDef="categoryName">
      <mat-header-cell *matHeaderCellDef> First Name </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.firstName}} </mat-cell>
      
      //This is the part for which the code is breaking
      <mat-footer-cell *matFooterCellDef> Your footer column Name will goes here </mat-footer-cell>**
    </ng-container>
    <ng-container matColumnDef="categoryName">
      <mat-header-cell *matHeaderCellDef> Last Name </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.lastName}} </mat-cell>
      
      //This need to be included in all your columns
      <mat-footer-cell *matFooterCellDef> Your 2nd footer column Name will goes here </mat-footer-cell>**
    </ng-container>
    <mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"></mat-footer-row>
  </mat-table>
</div>

此查询将汇总联合中两个选择的值,并通过使用RowNumber字段(其中RowNumber = 1是最高MPR值)来选择最高MPR值的ANNUAL_STATEMENT_MPR_ACTIVITY_ID值。 (考虑将CTE重命名为在您的上下文中更有意义的内容)