0

次のコードに問題があります。

    SELECT PM.PM_Eng_Name, ISNULL(SUM(PMOutput.Quantity),0) AS TotalOut
FROM PM LEFT OUTER JOIN
PMOutput ON PM.PM_code = PMOutput.PM_code
WHERE (PMOutput.Output_Date BETWEEN ‘2013-01-01’ AND ‘2013-08-25’)
GROUP BY PM.PM_Eng_Name  

このクエリを実行すると、選択した日付中に出力トランザクションが発生した材料のみの合計出力が得られましたが、出力のない材料の値は 0 で、所有しているすべての PM_Eng_Names の合計出力を生成する必要があります。選択した日付範囲内のトランザクション 注: WHERE 句を削除すると完璧なレポートが得られましたが、プロジェクトにとって日付は重要です。

4

3 に答える 3

4

正しい結果を得るには、日付条件をjoinの代わりに追加し、 の中whereに入れisnullますsum

select
    PM.PM_Eng_Name,
    sum(isnull(PMOutput.Quantity, 0)) as TotalOut
from PM
    left outer join PMOutput on PM.PM_code = PMOutput.PM_code and PMOutput.Output_Date BETWEEN ‘2013-01-01’ AND ‘2013-08-25’
group by PM.PM_Eng_Name
于 2013-08-25T11:20:36.267 に答える
1

これは、「外部結合」列にnullのみが含まれているためだと思います。そのためPMOutput、where句によってフィルタリングされます

で何が起こるか:

WHERE PMOutput.Output_Date is null or (PMOutput.Output_Date BETWEEN ‘2013-01-01’ AND ‘2013-08-25’) 
于 2013-08-25T11:16:21.497 に答える
0

FROMは最初のロジック クエリ フェーズの 1 つで、WHEREが適用される前に完了します。がWHEREクエリに適用されると、Output_Date が であるため、多くの行が除外されますnull

したがって、最初にあなたの LEFT JOIN はこれを行います:

CREATE TABLE #j 
    (
    Name char(8)
    );
GO
INSERT INTO #j 
    values 
    ('jim'),
    ('michael'),
    ('raj'),
    ('jason'),
    ('tim');
GO

CREATE TABLE #q 
    (
    name char(8), 
    dateBirth datetime
    );
GO
INSERT INTO #q
    values 
    ('jim', '01 jan 2010'),
    ('michael', '01 sep 2010');
GO

SELECT * FROM #j LEFT OUTER JOIN #q ON #j.Name = #q.Name;

これは以下を返します。

ここに画像の説明を入力

SQL サーバーはNULL、クエリのどの段階で null を見つけ、どの演算子が null に適用されるかによって、異なる処理を行います。cluseではWHERE、この属性にフィルターを指定すると、DateBirth が null の行が破棄されることがわかります。

SELECT  *
FROM    #j
        LEFT OUTER JOIN #q ON
        #j.Name = #q.Name
WHERE   dateBirth BETWEEN '2000-01-01' AND '2020-01-01';

結果:

ここに画像の説明を入力

(「論理クエリ フェーズ」は良い Google でしょう)

于 2013-08-25T17:02:03.147 に答える