SQL 中表之间不同行和列的 Sum 和 Product
Sum and Product of different row and columns between tables in SQL
我有一个要求,我必须对数据库进行一些计算 in/on(即,在 SQL 查询中)。在解释我的要求之前,让我解释一下 table 结构:
关系Table
Client(k) PolicyCvg(k) Relationship
----------------------------------------------------
RAJ 1234 00 OWNER
RAJ 1234 01 INSURED
BRAD ASDF 00 OWNER
RAJ ASDF 01 INSURED
BRAD ASDF 02 INSURED
BRAD ASDF 03 INSURED
BRAD ASDF 04 INSURED
BRAD ABCDEF00 OWNER
BRAD ABCDEF01 INSURED
RAJ ABCDEF01 INSURED
政策Table
Policy(k) Mode MaxCvgNum
------------------------------------------
1234 02 03
ASDF 06 04
ABCDEF 01 02
覆盖范围Table
Policy(k) Cvg(k) Amount Tax Risk
----------------------------------------------------------------------
1234 01 500.00 2.00 HIGH
ASDF 01 200.00 0.75 LOW
ASDF 02 300.00 0.76 LOW
ASDF 03 400.00 0.26 HIGH
ASDF 03 500.00 0.78 LOW
ABCDEF 01 1000.00 3.15 MEDIUM
ABCDEF 02 100.00 0.03 LOW
我的要求是将Coverage table中的Amount
和Tax
相加在一行中,然后乘以各自[=18=的Mode
] 在政策中 Table;让我们调用结果 AMT
.
然后对 Coverage table 中所有行的所有 AMT
(SUM (AMT)
) 求和。
要从 Coverage/Policy Table 中 Select 特定的策略行,我将首先从关系 table 中获取策略,其中 'BRAD' 是所有者。
到目前为止,我只能针对每个 table:
提出以下查询
SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
SELECT Mode
FROM Policy
WHERE Policy IN (
SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
)
SELECT Amount,Tax
FROM Coverage
WHERE Policy IN (
SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
)
我的输入将是客户,因此首先从关系 table 中获取该客户的策略,其中关系是 OWNER。
接下来从保单 table 中获取所选保单的模式,并从覆盖范围 table 中获取这些保单的金额和税收总和。
现在将从 Coverage table 中获得的 Sum 与从 Policy Table 中获得的 Mode 相乘。将所有保单获得的所有此类产品相加,并将其作为输出作为 TotalRisk。
现在我很困惑是构建一个复杂的联合查询还是构建一个 Oracle 函数来满足我的要求,我对这两个领域的知识都很少。
你们能帮帮我吗?
如果您使用的是 Oracle,您可以尝试以下操作:
select
r.client
,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_x_mode
,sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as tax_x_mode
,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) + sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_tax_x_mode
from relationship r
inner join policy p
on trim(p.policy) = trim(SUBSTRING(r.PolicyCvg,1,6))
inner join coverage c
on trim(c.policy) = trim(SUBSTRING(r.PolicyCvg,1,6))
where r.relationship = 'OWNER'
and r.client = 'BRAD'
group by r.client
;
不过我觉得您可能希望在 Coverage table 的联接中包含 cvg。如果是,请告诉我,我可以为您调整查询。
我有一个要求,我必须对数据库进行一些计算 in/on(即,在 SQL 查询中)。在解释我的要求之前,让我解释一下 table 结构:
关系Table
Client(k) PolicyCvg(k) Relationship
----------------------------------------------------
RAJ 1234 00 OWNER
RAJ 1234 01 INSURED
BRAD ASDF 00 OWNER
RAJ ASDF 01 INSURED
BRAD ASDF 02 INSURED
BRAD ASDF 03 INSURED
BRAD ASDF 04 INSURED
BRAD ABCDEF00 OWNER
BRAD ABCDEF01 INSURED
RAJ ABCDEF01 INSURED
政策Table
Policy(k) Mode MaxCvgNum
------------------------------------------
1234 02 03
ASDF 06 04
ABCDEF 01 02
覆盖范围Table
Policy(k) Cvg(k) Amount Tax Risk
----------------------------------------------------------------------
1234 01 500.00 2.00 HIGH
ASDF 01 200.00 0.75 LOW
ASDF 02 300.00 0.76 LOW
ASDF 03 400.00 0.26 HIGH
ASDF 03 500.00 0.78 LOW
ABCDEF 01 1000.00 3.15 MEDIUM
ABCDEF 02 100.00 0.03 LOW
我的要求是将Coverage table中的Amount
和Tax
相加在一行中,然后乘以各自[=18=的Mode
] 在政策中 Table;让我们调用结果 AMT
.
然后对 Coverage table 中所有行的所有 AMT
(SUM (AMT)
) 求和。
要从 Coverage/Policy Table 中 Select 特定的策略行,我将首先从关系 table 中获取策略,其中 'BRAD' 是所有者。
到目前为止,我只能针对每个 table:
提出以下查询SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
SELECT Mode
FROM Policy
WHERE Policy IN (
SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
)
SELECT Amount,Tax
FROM Coverage
WHERE Policy IN (
SELECT SUBSTRING(PolicyCvg,1,6) AS Policy
FROM Relationship
WHERE RELATIONSHIP = 'OWNER' AND CLIENT = 'BRAD'
)
我的输入将是客户,因此首先从关系 table 中获取该客户的策略,其中关系是 OWNER。
接下来从保单 table 中获取所选保单的模式,并从覆盖范围 table 中获取这些保单的金额和税收总和。
现在将从 Coverage table 中获得的 Sum 与从 Policy Table 中获得的 Mode 相乘。将所有保单获得的所有此类产品相加,并将其作为输出作为 TotalRisk。
现在我很困惑是构建一个复杂的联合查询还是构建一个 Oracle 函数来满足我的要求,我对这两个领域的知识都很少。
你们能帮帮我吗?
如果您使用的是 Oracle,您可以尝试以下操作:
select
r.client
,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_x_mode
,sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as tax_x_mode
,sum(c.amount) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) + sum(c.tax) * max(to_number(case when p.status = 'Pending' then '0' else p.mode end)) as amount_tax_x_mode
from relationship r
inner join policy p
on trim(p.policy) = trim(SUBSTRING(r.PolicyCvg,1,6))
inner join coverage c
on trim(c.policy) = trim(SUBSTRING(r.PolicyCvg,1,6))
where r.relationship = 'OWNER'
and r.client = 'BRAD'
group by r.client
;
不过我觉得您可能希望在 Coverage table 的联接中包含 cvg。如果是,请告诉我,我可以为您调整查询。