2017-08-09 15 views
1

私は最初はすばらしい仕事をしていたSQLコードを持っていましたが、その後CASEに新しい項目を追加しなくてはなりませんでした。計算。私は完成した日付でグループ化したいとは思っていませんが、それはちょうどケースのためですが、私はそれを持っていなければ私のコードが爆発します。SQLは完全にGROUP BYではありません

EDIT:元のコードはうまくいきましたが、完了日を追加してCASEを追加しなければならなかったので、GROUP BYに追加しないとエラーになりました。元のコードと同じようにグループ化します。 このコードが行うことは、他のテーブルからの情報の束をとって、誰かがどれくらい借りているか、誰かがどれくらい支払って差額を吐き出すかを計算します。

動作しないオリジナルのコード

INSERT INTO #ThisReportAll (CustomerID,Year,OverdueBalance,YearSetupId) 
SELECT t.CustomerId, ys.Name AS Year,SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
AS TtlOwnerCost, t.YearSetupId AS YearSetupId 
FROM #TotalAnimalCostAll t 
LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID 
LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId 
LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID 
GROUP BY t.CustomerId,ys.Name,cp.TtlPayments, ba.Amount, t.YearSetupId 

新しいコードすべて私はあなたにもなくで、新しいコードでt.Completeによってグループ化されて見る方法

INSERT INTO #ThisReportAll (CustomerID,Year,OverdueBalance,YearSetupId) 
SELECT t.CustomerId, ys.Name AS Year, 
CASE 
     WHEN SUM(t.TtlSpeciesCost) < 5 AND t.Complete < CONVERT(DATE,'01-01-2017') 
     THEN (5) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
     ELSE SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
END 
AS TtlOwnerCost, t.YearSetupId AS YearSetupId 
FROM #TotalAnimalCostAll t 
LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID 
LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId 
LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID 
GROUP BY t.CustomerId,ys.Name,cp.TtlPayments, ba.Amount, t.YearSetupId, t.Complete 
+2

私はあなたがコードが何をすべきかを説明することをお勧めします。サンプルデータと望ましい結果が役立ちます。動作していないコードは、必ずしもコミュニケーションの意図において良い仕事をしません。 –

+0

さて、あなたのグループにt.Completeを追加しました。したがって、同じグループ化ではありません... –

+0

SELECTカラム式の 'CASE'は、同じSELECTの' GROUP BY'に影響を与えることはできません( 'GROUP BY'も編集されていない限り)。この場合、あなたは 'GROUP BY'を編集しました。これはその動作を変更したものです。 – RBarryYoung

答えて

2

CompleteGROUP BYに影響しないようにするには、を選択しないサブクエリでCASEを実行する必要があります。次に、グループ化しているデータにその余分なフィールドはありません。このように:

SELECT [whatever fields] 
from 
    (
    SELECT t.CustomerId, ys.Name AS Year, 
    CASE 
     WHEN SUM(t.TtlSpeciesCost) < 5 AND t.Complete < CONVERT(DATE,'01-01-2017') 
     THEN (5) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
     ELSE SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
    END 
    AS TtlOwnerCost, t.YearSetupId AS YearSetupId 
    FROM #TotalAnimalCostAll t 
    LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID 
    LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId 
    LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID 
    ) as a 
GROUP BY a.CustomerId, a.Name,a.TtlPayments, a.Amount, a.YearSetupId 
3

元のコードあなたの結果はそれを説明する必要があり、そうでないと間違っています。

Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0)はCASEステートメントにありますが、ステートメントが他の場所でSUMを使用している場合は集計されません。

関連する問題