2014-01-24 62 views
1

我有两个表V和E,我需要做一个奇怪的左加入。左加入两个独有条件

在E表有列:

  • COD_Obj具有6个字母

    ,其具有3个字母

在V表

  • COD_P有一列:

    • O_OR_P作为可以具有互斥
      • 一个具有9个字母和它的第一个6个字母与E.COD_Obj
      • 在P相匹配的OBJ即12个字母和其最后的3个字母与E.COD_P
    匹配

    我尝试以下查询:

    SELECT DSC, 
    COUNT(IIF([Cost] IS NOT NULL, 1, NULL)) AS [N Cost] 
    , INT(SUM(IIF([Cost] IS NOT NULL, [Cost], 0))) AS [Total Cost] 
    , INT(SUM(IIF([Fees] IS NOT NULL, Fees, 0))) AS [Total Fees] 
    LEFT JOIN E ON LEFT(V.P_OR_O,6)=E.COD_Obj 
        OR RIGHT(V.P_OR_O,3)=E.COD_P 
    GROUP BY DSC 
    ORDER BY DSC 
    

    它确实分组正确的,但每个组返回TOO多电成本,总成本,和总费用的。我怀疑这个查询的结果有重复的事情。

    如果我将LEFT JOIN的OR更改为AND,我将只看到一行,仅对应于一个组。

    我感到眼花缭乱,感到困惑。请帮助如何做两个替代标准的比赛。而且,在你问之前,是的,V.P_OR_O字段可以有空/空值。

    不,我现在不能改变数据模型,因为人们依赖于这个数据库,并且我无法控制服务器重新定义数据库结构。

    这些表都在SQL服务器上,我使用Microsoft Office的Access来查询它们。

  • 回答

    0

    你应该能够长度加入到您的加入条件,这样的事情:

    SELECT 
    DSC 
    , COUNT(IIF([Cost] IS NOT NULL, 1, NULL)) AS [N Cost] 
    , INT(SUM(IIF([Cost] IS NOT NULL, [Cost], 0))) AS [Total Cost] 
    , INT(SUM(IIF([Fees] IS NOT NULL, Fees, 0))) AS [Total Fees] 
    FROM V 
    LEFT JOIN 
    E 
    ON (LEFT(V.P_OR_O,6)=E.COD_Obj AND LEN(IIF(ISNULL(P_OR_O),'',P_OR_O)) = 9) 
        OR (RIGHT(V.P_OR_O,3)=E.COD_P AND LEN(IIF(ISNULL(P_OR_O),'',P_OR_O)) = 12) 
    GROUP BY DSC 
    ORDER BY DSC 
    
    +0

    我纠正了查询,因为它没有工作。 Access中的ISNULL具有不同的含义:它表示值是否为空。我删除了链接,因为它们指向的文档不对应 – sergiol

    +0

    Altought现在的值稍低一些,查询仍然给我的值比它应该更大! – sergiol

    +0

    尝试删除总和和组,并将其运行到excel中,并查看错误的位置。该查询对我来说看起来很好,因此您的数据或您的数据描述有问题。如果表V具有这些值并且您只希望具有表E中的条目的值,则切换连接的顺序'FROM E LEFT JOIN V' – Ghost