2017-08-09 66 views
1

我有一個原本運行良好的SQL代碼,但後來我不得不向一個CASE添加一個新項目,現在我的GROUP BY將不會像以前一樣完全組合在一起,並且它搞亂了我的計算。我甚至不想按照完成的日期進行分組,只是出現這種情況,但如果我沒有在那裏,我的代碼就會爆炸。SQL不會GROUP BY完全

編輯︰原始代碼工作很好,但我不得不添加完成的日期,所以我可以添加一個CASE,然後它錯誤,如果我不將它添加到GROUP BY,所以我添加它,現在它doesn按照原始代碼的方式進行分組。 這段代碼的功能是從其他表中獲取一堆信息,它計算出某人欠多少錢,多少人付錢並吐出差異。

原代碼

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 

新代碼不起作用所有的路

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

如果你不想Complete影響你的GROUP BY你需要做一個子查詢CASE不選擇Complete。然後,您在分組數據中沒有額外的字段。像這樣:

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

我看你也t.Complete新代碼的分組,而不是在原始代碼。你的結果需要考慮到這一點,否則他們會錯誤的。

對於我來說,Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0)在您的CASE語句中似乎也很奇怪,但是當語句在其他地方使用SUM時不會聚合。