2013-10-01 80 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')