2014-01-24 88 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