2017-08-19 10 views
0

自分で結果セットを計算しようとしていますが、WHERE句が私に問題を引き起こしているという奇妙な問題に直面しています。次のようにWhere句がクエリからSQL Serverを削除する

表は次のとおりである: -

Customer 
CustomerId CustomerName 
2   Jayesh 
5   Hasan 

SaleInvoiceMaster 
CustomerId TotalInvoiceAmount 
1   50000 

PurchaseInvoiceMaster 
CustomerId TotalInvoiceAmount 
1   10000 

PaymentTransactions 
CustomerId PaymentAmount 
1   10000 

次のように動作している結果セットがある: -

SELECT DISTINCT C.CustomerId AS CustomerId, C.Name AS CustomerName, ISNULL(SIM.TotalSale, 0), ISNULL(PIM.TotalPurchase, 0), ISNULL(PT.TotalPaid, 0), ISNULL(SIM.TotalSale - PIM.TotalPurchase - PT.TotalPaid, 0) AS AmountPending 
FROM Customers AS C 
LEFT OUTER JOIN (SELECT CustomerId, ISNULL(SUM(TotalInvoiceAmount),0) AS TotalSale FROM SaleInvoiceMaster GROUP BY CustomerId) AS SIM ON SIM.CustomerId = C.CustomerId 
LEFT OUTER JOIN (SELECT CustomerId, ISNULL(SUM(TotalInvoiceAmount),0) AS TotalPurchase FROM PurchaseInvoiceMaster GROUP BY CustomerId) AS PIM ON PIM.CustomerId = C.CustomerId 
LEFT OUTER JOIN (SELECT CustomerId, PaymentStatus, ISNULL(SUM(PaymentAmount),0) AS TotalPaid FROM PaymentTransactions AS P GROUP BY CustomerId, PaymentStatus) AS PT ON PT.CustomerId = C.CustomerId 

下図に示すように同じに対する結果が

あります

Result Set

最後のfに3番目の句を追加すると左外部結合、問題が発生します。計算が停止し、ゼロが表示されます。次のように私の更新クエリは次のとおりです。 -

SELECT DISTINCT C.CustomerId AS CustomerId, C.Name AS CustomerName, ISNULL(SIM.TotalSale, 0), ISNULL(PIM.TotalPurchase, 0), ISNULL(PT.TotalPaid, 0), ISNULL(SIM.TotalSale - PIM.TotalPurchase - PT.TotalPaid, 0) AS AmountPending 
FROM Customers AS C 
LEFT OUTER JOIN (SELECT CustomerId, ISNULL(SUM(TotalInvoiceAmount),0) AS TotalSale FROM SaleInvoiceMaster GROUP BY CustomerId) AS SIM ON SIM.CustomerId = C.CustomerId 
LEFT OUTER JOIN (SELECT CustomerId, ISNULL(SUM(TotalInvoiceAmount),0) AS TotalPurchase FROM PurchaseInvoiceMaster GROUP BY CustomerId) AS PIM ON PIM.CustomerId = C.CustomerId 
LEFT OUTER JOIN (SELECT CustomerId, ISNULL(SUM(PaymentAmount),0) AS TotalPaid FROM PaymentTransactions AS PT1 WHERE (PT1.PaymentStatus = 'Payment Made' OR PT1.PaymentStatus = 'Bad Debt') GROUP BY CustomerId) AS PT ON PT.CustomerId = C.CustomerId 

結果セットは次のようになります - あなたはこれをやっている、あなたのメインを選択し、体内の

Result denied

+0

この列はどこですか?[PaymentStatus]?私はあなたのフィルタでそれを見ることができますが、他にどこですか? – Shnugo

答えて

0

ISNULL(SIM.TotalSale - PIM.TotalPurchase - PT.TotalPaid, 0) AS AmountPending 

これは戻っていますこれらの列のいずれかがNULLの場合は0を返します。

ISNULL(SIM.TotalSale, 0) - ISNULL(PIM.TotalPurchase, 0) - ISNULL(PT.TotalPaid, 0) AS AmountPending 

以上の現在の構文ではなく、ISNULLの使用COALESCEのために:

COALESCE(SIM.TotalSale, 0) - COALESCE(PIM.TotalPurchase, 0) - COALESCE(PT.TotalPaid, 0) AS AmountPending 
0

クエリにいくつかの混乱を持っています。まず、一番外側のクエリにselect distinctは必要ありません。第2に、サブクエリに一致する行を返さないサブクエリとサブクエリの値がNULLであることに違いがあります。第3に、潜在的にNULL値を追加しています。

クエリの改良版:

SELECT C.CustomerId, C.Name AS CustomerName, 
     COALESCE(SIM.TotalSale, 0) as TotalSale, 
     COALESCE(PIM.TotalPurchase, 0) as TotalPurchase, 
     COALESCE(PT.TotalPaid, 0) as TotalPaid, 
     (COALESCE(SIM.TotalSale, 0) - COALESCE(PIM.TotalPurchase, 0) 
- COALESCE(PT.TotalPaid, 0) 
     ) as AmountPending 
FROM Customers C LEFT OUTER JOIN 
    (SELECT CustomerId, SUM(TotalInvoiceAmount) AS TotalSale 
     FROM SaleInvoiceMaster 
     GROUP BY CustomerId 
    ) SIM 
    ON SIM.CustomerId = C.CustomerId LEFT OUTER JOIN 
    (SELECT CustomerId, SUM(TotalInvoiceAmount) AS TotalPurchase 
     FROM PurchaseInvoiceMaster 
     GROUP BY CustomerId 
    ) PIM 
    ON PIM.CustomerId = C.CustomerId LEFT OUTER JOIN 
    (SELECT CustomerId, SUM(PaymentAmount) AS TotalPaid 
     FROM PaymentTransactions PT1 
     WHERE PT1.PaymentStatus IN ('Payment Made', 'Bad Debt') 
     GROUP BY CustomerId 
    ) PT 
    ON PT.CustomerId = C.CustomerId; 

SELECT DISTINCTを削除するには、パフォーマンスが向上し、クエリがより読みやすくなります。 CustomerIdCustomersで一意であると仮定すると、重複は作成できません。

サブクエリでISNULL()を削除すると、クエリが読みやすくなります。この操作は何も行いません。NULLの後に処理する必要があります。の後にJOINを処理する必要があります。

ORINに置き換えると、クエリが読みやすくなります。

関連する問題