我在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)
此查询产生以下结果:
和我想要的结果集应该像这样:
在计算SUM(MPR)和SUM(DP_GROSS_DEPOSIT)列之后,每个VALUATION_DATE列值都应该只有一行,并且ANNUAL_STATEMENT_MPR_ACTIVITY_ID列值应取为MAX(MPR)。我尝试了很多,但我认为这是不可能的。我说的对吗?
答案 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重命名为在您的上下文中更有意义的内容)