我试图在Field" Policy"上加入3个表,A,B和C.表B和C还有一个名为" Value"的字段。 A中的Policy Field仅存储每个策略的前4位数字,而B和C存储完整的7位数字。
我想要做的是,将A和B之间每个匹配的值相加,然后在C中查找A和B之间的每个匹配;如果策略存在于C中,则以C为单位的和值;如果C中不存在该策略,则返回0.最后,取两个值之间的差值,从C求和的值总和为零。
对不起,我知道这听起来有点令人困惑。我做了一些简单的表来说明我在这里要完成的事情。 " ..."只是意味着每个表中都没有显示大量其他条目。在所需的表格中,不需要中间列(来自B的值,来自C和计算的值),仅用于说明。我所关心的只是" Final"号。
[图示]
现在,我到目前为止尝试过:
SELECT
Sum(IIf([B]![Value]>[C]![Value],[B]![Value]-[C]![Value],0)) AS [Final]
FROM [C], [B], [A]
WHERE (((Left([C].[Policy],4))=[A].[Policy]) AND ((Left([B].[Policy],4))=[A].[Policy]));
(不是这样)显然,问题在于它内部连接所有的A,B和C,并且不会为A和B中的内容返回零,而不是在C中,因为我希望如此。我应该在哪里改变?
答案 0 :(得分:1)
我会保持简单,只需将A
加入两个子查询,每个子查询对应B
和C
表:
SELECT
a.Policy,
Nz(b.b_value, 0) AS b_value,
Nz(c.c_value, 0) AS c_value,
Nz(b.b_value, 0) - Nz(c.c_value, 0) AS final
FROM tableA a
LEFT JOIN
(
SELECT LEFT(Policy, 4) AS Policy, SUM(Value) AS b_value
FROM tableB
GROUP BY LEFT(Policy, 4)
) b
ON a.Policy = b.Policy
LEFT JOIN
(
SELECT LEFT(Policy, 4) AS Policy, SUM(Value) AS c_value
FROM tableC
GROUP BY LEFT(Policy, 4)
) b
ON a.Policy = c.Policy;
请注意,您可能还希望处理A
中的政策与B
或C
中的任何内容都不匹配的可能性。 Nz()
函数对此有用。
答案 1 :(得分:0)
我认为:
WITH
B1 AS (SELECT LEFT(POLICY,4) AS POLICY,Value AS BValue,0 AS CValue)
,C1 AS (SELECT LEFT(POLICY,4) AS POLICY,0 AS BValue,Value AS CValue)
,D AS (
SELECT
A.POLYCY
,SUM(isNULL(B1.BValue,0)+isNULL(C2.BValue,0)) AS BValues
,SUM(isNULL(B1.CValue,0)+isNULL(C1.CValue,0)) AS CValues
FROM A
LEFT JOIN B1 ON B1.POLICY=A.POLICY
LEFT JOIN C1 ON C1.POLICY=A.POLICY
GROUP BY A.POLICY
)
SELECT POLYCY,BValues,CValues,BValues-CValues AS Final
FROM D