我想按年份查找各组产品的总成本;并且,我想排除历史金额。我有三张桌子。 风险
Risks_RiskID
Risks_Change_Number
Risks_RiskGroup_ID
<other product properties>
风险_组
RiskGroup_ID
<other group properties>
费用
Costs_RiskID
Costs_Change_Number
Costs_FY
Cost_Risk_Amount
我可以使用此代码按年份获取总成本:
SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM (Risk_Groups LEFT JOIN
Risks
ON Risk_Groups.RiskGroup_ID = Risks.Risks_RiskGroup_ID)
LEFT JOIN Costs ON (Risks.Risks_Change_Number = Costs.Costs_Change_Number) AND (Risks.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY
我明白了
RiskGroupID Costs_FY TotalAmount
My test group FY 23 0
My test group FY 24 100000
My test group FY 25 120000
但有些风险有多个版本,我只想将最新版本的成本相加。 我使用此语句来查看每个产品的最新更改#。
(select r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID
from risks r
inner join (
select risks_Riskid, max(risks_change_number) as maxversion
from risks maxr group by risks_riskid) maxr
on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion)
我正在尝试使用每个风险的最新风险版本的视图来代替摘要查询中的风险表。过去,我用子查询替换了查询中的 from table 子句。但我想使用子查询代替 Risks 表。我尝试像这样替换它
SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM (Risk_Groups
LEFT JOIN
(select r.Risks_center_rank, r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID
from risks r
inner join (
select risks_Riskid, max(risks_change_number) as maxversion
from risks maxr group by risks_riskid) maxr
on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion)
ON Risk_Groups.RiskGroup_ID = r.Risks_RiskGroup_ID)
LEFT JOIN Costs ON (r.Risks_Change_Number = Costs.Costs_Change_Number) AND (r.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY
但是我收到一个错误,指出关键字 ON 附近的语法不正确(指第一个 ON 语句),我用表名 r 替换了表名 Risks,但在我看来 r 是不被识别为桌子。
子查询
(select r.Risks_center_rank
... and r.Risks_Change_Number = maxr.MaxVersion)
成为虚拟表并需要名称。在下图中,我将其称为“LatestRisks”
那么外层 select 的其他部分只能通过该名称引用数据,而不能引用子查询中涉及的任何表。
那么,Risk_Groups 的加入应该是
Risk_Groups.RiskGroup_ID = LatestRisks.Risks_RiskGroup_ID
,而成本的加入应该是这样的 ON (LatestRisks.Risks_Change_Number = Costs.Costs_Change_Number) AND (LatestRisks.Risks_RiskID = Costs.Costs_RiskID)
这是更新后的查询,布局稍作修改,以帮助我理解表关系。
SELECT Risk_Groups.RiskGroup_ID, Costs.Costs_FY, Sum(Costs.Costs_Risk_Amount) AS TotalAmount
FROM
(Risk_Groups
LEFT JOIN
(select r.Risks_center_rank, r.Risks_RiskID, r.Risks_change_number, r.Risks_RiskGroup_ID
from risks r
inner join
(select risks_Riskid, max(risks_change_number) as maxversion
from risks maxr group by risks_riskid
) maxr on r.Risks_RiskID = maxr.Risks_RiskID and r.Risks_Change_Number = maxr.MaxVersion
) AS LatestRisks ON Risk_Groups.RiskGroup_ID = LatestRisks.Risks_RiskGroup_ID
)
LEFT JOIN Costs ON (LatestRisks.Risks_Change_Number = Costs.Costs_Change_Number) AND (LatestRisks.Risks_RiskID = Costs.Costs_RiskID)
where Risk_Groups.RiskGroup_ID = 'My test group'
GROUP BY Risk_Groups.RiskGroup_ID, Costs.Costs_FY