2013-10-01 79 views
0
SELECT 
C.ClientCaseNumber, 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId IN (28, 29, 30) THEN 1 
     ELSE 0 
    END) AS [Wezwania], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId IN (14, 21) THEN 1 
     ELSE 0 
    END) AS [Kontakt], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 32 THEN 1 
     ELSE 0 
    END) AS [SMS], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 44 THEN 1 
     ELSE 0 
    END) AS [Zgon], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 49 THEN 1 
     ELSE 0 
    END) AS [Areszt], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 37 THEN 1 
     ELSE 0 
    END) AS [Odmowa], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 39 THEN 1 
     ELSE 0 
    END) AS [Podważa], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 99 THEN 1 
     ELSE 0 
    END) AS [Ugoda] 
FROM (SELECT cast(Notes as char) AS [Adres], CaseActionDefinitionId AS [Info1], NULL AS [Numer], NULL as  [Info2], NULL AS [Mail], NULL as [Info3], NULL AS [Powód], CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 68 
    UNION ALL 
    SELECT NULL, NULL, cast(Info as char), CaseActionDefinitionId, NULL, NULL, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId IN (54, 55, 56, 58, 
             59, 60, 61, 62, 63) 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, cast(Notes as char), CaseActionDefinitionId, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 66 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, NULL, NULL, cast(Description as char(100)), CaseDetailId 
     FROM CaseActionDefinition JOIN CaseActionHistory AS C ON DefinitionId = C.CaseActionDefinitionId 
     WHERE DefinitionId BETWEEN 70 AND 78) AS x 
     INNER JOIN CaseDetails AS C 
       ON x.CaseDetailId = C.CaseDetailsId 
     INNER JOIN CaseActionHistory AS CA 
       ON C.CaseDetailsId = CA.CaseDetailId 
WHERE C.ClientId = 11 
GROUP BY C.ClientCaseNumber 

我遇到了sum(case)的問題。無論何時刪除CaseActionHistory記錄(CA.IsDeleted ='True'),值都乘以x2或有時甚至更多,沒有任何理由。僅運行查詢的某個部分例如:條件滿足時值相乘

SELECT 
C.ClientCaseNumber 
,Sum(CASE 
     WHEN CA.CaseActionDefinitionId IN (28, 29, 30) THEN 1 
     ELSE 0 
    END) AS [Wezwania] 
from 
CaseActionHistory as CA 
join CaseDetails as C on CA.CaseDetailId = C.CaseDetailsId 
where C.ClientId = '11' 
group by CD.ClientCaseNumber 

總和記錄完全沒有任何問題。

更重要的是我需要添加一個參數

....AS x 
      INNER JOIN CaseDetails AS C 
        ON x.CaseDetailId = C.CaseDetailsId 
      INNER JOIN CaseActionHistory AS CA 
        ON C.CaseDetailsId = CA.CaseDetailId 
    WHERE C.ClientId = 11 and CA.IsDeleted <> 'True' 
    GROUP BY C.ClientCaseNumber 

然而,這所有的螺絲計數和所有款項,都等於0。但是,什麼是有趣的使用:

AS x 
      INNER JOIN CaseDetails AS C 
        ON x.CaseDetailId = C.CaseDetailsId 
      INNER JOIN CaseActionHistory AS CA 
        ON C.CaseDetailsId = CA.CaseDetailId 
    WHERE C.ClientId = 11 and CA.IsDeleted = 'True' 
    GROUP BY C.ClientCaseNumber 

完美的作品,它總結刪除的代碼。

IsDeleted可以有三個值:NULL/True/False,默認爲NULL。在將代碼設爲已刪除後爲true;恢復代碼後錯誤。


declare @table table (
ClientCaseNumber int 
,SetId int 
,Wezwania int 
,Kontakt int 
,SMS int 
,Zgon int 
,Areszt int 
,Odmowa int 
,Podważa int 
,Ugoda int 
,Adres nvarchar(255) 
,Info1 nvarchar(255) 
,Numer nvarchar(255) 
,Info2 nvarchar(255) 
,Mail nvarchar(255) 
,Info3 nvarchar(255) 
,Powód nvarchar(255)) 

insert into @table (
ClientCaseNumber 
,Wezwania 
,Kontakt 
,SMS 
,Zgon 
,Areszt 
,Odmowa 
,Podważa 
,Ugoda) 
SELECT 
C.ClientCaseNumber, 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId IN (28, 29, 30) THEN 1 
     ELSE 0 
    END) AS [Wezwania], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId IN (14, 21) THEN 1 
     ELSE 0 
    END) AS [Kontakt], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 32 THEN 1 
     ELSE 0 
    END) AS [SMS], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 44 THEN 1 
     ELSE 0 
    END) AS [Zgon], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 49 THEN 1 
     ELSE 0 
    END) AS [Areszt], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 37 THEN 1 
     ELSE 0 
    END) AS [Odmowa], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 39 THEN 1 
     ELSE 0 
    END) AS [Podważa], 
Sum(CASE 
     WHEN CA.CaseActionDefinitionId = 99 THEN 1 
     ELSE 0 
    END) AS [Ugoda] 
FROM (SELECT cast(Notes as char) AS [Adres], CaseActionDefinitionId AS [Info1], NULL AS [Numer], NULL as  [Info2], NULL AS [Mail], NULL as [Info3], NULL AS [Powód], CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 68 
    UNION ALL 
    SELECT NULL, NULL, cast(Info as char), CaseActionDefinitionId, NULL, NULL, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId IN (54, 55, 56, 58, 
             59, 60, 61, 62, 63) 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, cast(Notes as char), CaseActionDefinitionId, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 66 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, NULL, NULL, cast(Description as char(100)), CaseDetailId 
     FROM CaseActionDefinition JOIN CaseActionHistory AS C ON DefinitionId = C.CaseActionDefinitionId 
     WHERE DefinitionId BETWEEN 70 AND 78) AS x 
     INNER JOIN CaseDetails AS C 
       ON x.CaseDetailId = C.CaseDetailsId 
     INNER JOIN CaseActionHistory AS CA 
       ON C.CaseDetailsId = CA.CaseDetailId 
WHERE C.ClientId = 11 and (CA.IsDeleted <> 'True' OR CA.IsDeleted IS NULL) 
GROUP BY C.ClientCaseNumber 

update @table 
set SetId = X.SetId 
, Adres = X.Adres 
,Info1 = X.Info1 
,Numer = X.Numer 
,Info2 = X.Info2 
,Mail = X.Mail 
,Info3 = X.Info3 
,Powód = X.Powód 
from 
@table as T 
join (
SELECT 
    C.ClientCaseNumber, 
    C.ClientId, 
    C.SetId, 
    [Adres], 
    [Info1], 
    [Numer], 
    [Info2], 
    [Mail], 
    [Info3], 
    [Powód] 
FROM (SELECT cast(Notes as char) AS [Adres], CaseActionDefinitionId AS [Info1], NULL AS [Numer], NULL as [Info2], NULL AS [Mail], NULL as [Info3], NULL AS [Powód], CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 68 
    UNION ALL 
    SELECT NULL, NULL, cast(Info as char), CaseActionDefinitionId, NULL, NULL, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId IN (54, 55, 56, 58, 
             59, 60, 61, 62, 63) 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, cast(Notes as char), CaseActionDefinitionId, NULL, CaseDetailId 
     FROM CaseActionHistory 
     WHERE CaseActionDefinitionId = 66 
    UNION ALL 
     SELECT NULL, NULL, NULL, NULL, NULL, NULL, cast(Description as char(100)), CaseDetailId 
     FROM CaseActionDefinition JOIN CaseActionHistory AS C ON DefinitionId = C.CaseActionDefinitionId 
     WHERE DefinitionId BETWEEN 70 AND 78) AS x 
     INNER JOIN CaseDetails AS C 
       ON x.CaseDetailId = C.CaseDetailsId 
     INNER JOIN CaseActionHistory AS CA 
       ON C.CaseDetailsId = CA.CaseDetailId 
    WHERE 
     C.ClientId = 11 
) as X on X.ClientCaseNumber = T.ClientCaseNumber 

SELECT DISTINCT ClientCaseNumber, 
      SetId, 
      [Wezwania], 
      [Kontakt], 
      [SMS], 
      [Zgon], 
      [Areszt], 
      [Odmowa], 
      [Podważa], 
      [Ugoda], 
      [Adres], 
      [Info1], 
      [Numer], 
      [Info2], 
      [Mail], 
      [Info3], 
      [Powód] 
    FROM @table 
+0

嘗試改變'ISNULL(CA.IsDeleted,0)<> 0 ' – veljasije

+0

沒有。顯示完全不同的價值。 – glaeran

回答

1

嘗試改變

CA.IsDeleted <> 'True' 

(CA.IsDeleted <> 'True' OR CA.IsDeleted IS NULL) 
+0

作品。然而,在沒有任何原因的情況下,仍然會將值完全隨機地加倍或三倍化 – glaeran

+0

我並不確定上面的代碼的哪一部分需要檢查。這裏有很多,我不確定哪個位失敗。 – Szymon

+0

好,所以我做了檢查。刪除子選擇(標記爲X),並從CaseActionHistory作爲CA而不是這一個,它工作正常。 – glaeran

0

嘗試這種

(isnull(CA.IsDeleted,'')='' or CA.IsDeleted <> 'True')