2016-05-17 12 views
-1

以下のクエリは、エラーが発生したクエリの簡略化されたバージョンです。この小さなクエリでは、前に左の結合を効果的に無効にしていたwhere節がありました。SQL - 複雑なクエリLEFT JOIN with WHERE

SELECT FC_Name, COUNT(F.Findings_ID) AS 'No_of_Findings' 
FROM FindingCategories AS FC 
LEFT OUTER JOIN Findingsubcategories AS FSC ON FSC.FC_ID = FC.FC_ID 
LEFT OUTER JOIN Findings AS F ON F.FSC_ID = FSC.FSC_ID AND F.AU_ID = @Audit_ID 
LEFT OUTER JOIN Audit AS A ON A.Audit_ID = F.AU_ID 
GROUP BY FC_Name 

は今 - 残念ながら、私がしようとしているもののために、このクエリを使用するカント、達成: 私は、現在の選択のための私のデータベースで詳細を取得する必要があり、前年からの値。以下に示す:

SELECT A.Audit_ID, c.FC_Name, COUNT(c.FC_Name) AS 'No_of_Findings' 
FROM Audit AS A 
    LEFT OUTER JOIN Findings F on A.Audit_ID = f.AU_ID 
    LEFT OUTER JOIN FindingCategories C on C.FC_ID = F.Findings_category_ID 
    LEFT OUTER JOIN GovernmentAgencies GA on GA.GA_ID = A.GA_ID 
    LEFT OUTER JOIN AuditType AT on AT.AuditType_ID = a.AuditType_ID 
WHERE A.Audit_Year= @Year AND (@Agency IS NULL OR ga.GA_LegalName = @Agency) 
          AND (@AuditType is null or @AuditType = AT.AuditType_Category) 
          AND (@Audit_ID is null or @Audit_ID = a.Audit_ID) 
GROUP BY A.Audit_Year, c.FC_Name, A.Audit_ID 

SELECT a.Audit_ID, c.FC_Name, COUNT(c.FC_Name) AS 'No_of_Findings' 
FROM Audit AS A 
    LEFT OUTER JOIN Findings F on a.Audit_ID = f.AU_ID 
    LEFT OUTER JOIN FindingCategories C on C.FC_ID = F.Findings_category_ID 
    LEFT OUTER JOIN GovernmentAgencies GA on GA.GA_ID = a.GA_ID 
    LEFT OUTER JOIN AuditType AT on AT.AuditType_ID = a.AuditType_ID 
WHERE a.Audit_Year= '@Year-1 AND (@Agency IS NULL OR ga.GA_LegalName = @Agency) 
          AND (@AuditType is null or @AuditType = AT.AuditType_Category) 
GROUP BY a.Audit_Year, c.FC_Name, a.Audit_ID 

は再び、私の最初のクエリごとに私が参加し、私の私の左を回すインナーに参加実現、私は無駄にこれを解決するには、いくつかの異なる方法を試してみました。問題を解決するためにこれをどのように変更するのですか?

サンプルデータ: 表1 /表2

enter image description here

ようにどうあるべきか。表1 - 単純なクエリを使用して:

enter image description here

+0

、すべての 'LEFT OUTER JOIN'sであなたの' SELECT'クエリはデータを返しますが、あなたはそれに 'WHERE'句を追加するとき、それはしないのですか?場合それは質問ですか?それはAudit_Yearの句が常にfalseを返すのでしょうか? – Ash

+0

@Ashwin Nairいいえ、本質的に - where節は私の左の結合を内側の結合に変え、それでC言語でグラフを作成する必要があるnullを取り除きます。 – Krono

+0

そうです。私たちはあなたのデータを見ることができないので、ここであなたのデータを無効にしている句を見つける必要があります: 'WHERE A.Audit_Year = @Year AND(@Agency IS NULL OR ga.GA_LegalName = @Agency) AND @AuditTypeがnullまたは@AuditType = AT.AuditType_Category) AND(@Audit_IDがnullまたは@Audit_ID = a.Audit_ID) ' – Ash

答えて

2

WHERE句から条件を入れてみてくださいON

SELECT 
    a.Audit_ID, 
    c.FC_Name, 
    COUNT(c.FC_Name) AS 'No_of_Findings' 
FROM Audit AS A 
LEFT OUTER JOIN Findings F 
    ON a.Audit_ID = f.AU_ID 
LEFT OUTER JOIN FindingCategories C 
    ON C.FC_ID = F.Findings_category_ID 
LEFT OUTER JOIN GovernmentAgencies GA 
    ON GA.GA_ID = a.GA_ID 
    AND (@Agency IS NULL OR ga.GA_LegalName = @Agency) 
LEFT OUTER JOIN AuditType AT 
    ON AT.AuditType_ID = a.AuditType_ID 
    AND AT.Audit_Year = @Year - 1 
    AND (@AuditType IS NULL OR @AuditType = AT.AuditType_Category) 
GROUP BY a.Audit_Year, c.FC_Name, a.Audit_ID 
+0

私はこれを既に試してみましたが、919から933のIDを持つすべてのデータフィールドを返します。前の年だけでなく、両方のテーブルが必要です – Krono

+0

サンプルデータと予想される結果を提供する必要があります。私たちはあなたのモニターを見たり、あなたの心を読んだりできません。 –

+0

質問が更新されました@FelixPamittan – Krono

0
  1. おそらく、それらを両方の年に1つのクエリに結合します。
  2. 正しい結果セットにフィルタを適用するには、CTEまたはサブクエリを使用します。
  3. null可能なパラメータにISNULLを使用します。だから、

WITH CTE AS (SELECT A.Audit_ID, A.Audit_Year, c.FC_Name, ga.GA_LegalName, AT.AuditType_Category, COUNT(c.FC_Name) AS 'No_of_Findings' FROM Audit AS A LEFT OUTER JOIN Findings F ON A.Audit_ID = f.AU_ID LEFT OUTER JOIN FindingCategories C ON C.FC_ID = F.Findings_category_ID LEFT OUTER JOIN GovernmentAgencies GA ON GA.GA_ID = A.GA_ID LEFT OUTER JOIN AuditType AT ON AT.AuditType_ID = a.AuditType_ID WHERE A.Audit_Year IN (@Year, @Year - 1) GROUP BY A.Audit_Year, c.FC_Name, ga.GA_LegalName, AT.AuditType_Category, A.Audit_ID) SELECT Audit_ID, Audit_Year, FC_Name, No_of_Findings FROM CTE WHERE GA_LegalName = ISNULL(@Agency, GA_LegalName) AND AuditType_Category = ISNULL(@AuditType, AuditType_Category) AND Audit_ID = ISNULL(@Audit_ID, Audit_ID);

+0

これの出力はサンプルデータと変わりません – Krono