使用条件

时间:2018-03-23 03:28:06

标签: sql ms-access join access

我试图在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中,因为我希望如此。我应该在哪里改变?

2 个答案:

答案 0 :(得分:1)

我会保持简单,只需将A加入两个子查询,每个子查询对应BC表:

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中的政策与BC中的任何内容都不匹配的可能性。 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
相关问题