Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 值在不应该的情况下相乘_Tsql - Fatal编程技术网

Tsql 值在不应该的情况下相乘

Tsql 值在不应该的情况下相乘,tsql,Tsql,我有这样的疑问 select D.Name ,C.ClientId ,C.SetId ,C.CaseId ,C.ClientCaseNumber ,sum(DD.TransferedCapital) as [TransferedCapital] ,sum(PDH.Capital) as [Capital] ,sum(PDH.Other) as [Other] ,sum(PDH.InterestsU) as [InterestsU] ,PH.AccountType ,sum(PDH.Overpa

我有这样的疑问

select
D.Name
,C.ClientId
,C.SetId
,C.CaseId
,C.ClientCaseNumber
,sum(DD.TransferedCapital) as [TransferedCapital]
,sum(PDH.Capital) as [Capital] 
,sum(PDH.Other) as [Other]
,sum(PDH.InterestsU) as [InterestsU]
,PH.AccountType
,sum(PDH.Overpayment) as [Overpayment]
,PROV.ProvisionValue
,PH.OpDate
,C.DateImported
FROM CaseDetails as C
join DebtorDetails as D on C.CaseDetailsId = D.CaseDetailsId
join PaymentCaseHistory as PH on C.CaseDetailsId = PH.CaseDetailsId
join PaymentDocumentHistory as PDH on PH.PaymentId = PDH.PaymentCaseHistoryId
join ClientProvision as PROV on C.ProductId = PROV.ClientProductId
join DocumentDetails as DD on C.CaseDetailsId = DD.CaseDetailsId

WHERE (PH.IsDeleted is NULL or PH.IsDeleted <> 'True') and C.ProductId = PROV.ClientProductId and C.ClientId= '2'
GROUP by D.Name, C.ClientId, C.CaseId, C.SetId, C.ClientCaseNumber,  PH.AccountType, PDH.Overpayment, PH.OpDate, C.DateImported, PROV.ProvisionValue
ORDER by PH.OpDate
问题是:在很少的结果中,当有超过1个文档连接到case时,会乘以文档的数量

例如:

案例有3个文档,当用户添加与案例相关的付款时,该值在所有文档上分摊,直到0

本案资本为6100,但结果显示为18300。 已付资本应显示为4372,03,但显示为13116,09 等等

可能是我在分组的某个地方犯了个错误


查询应该是这样的:按案例汇总总资本、超额支付等,因此即使案例只有几个文档,也只显示一个汇总结果

您可以删除连接到DocumentDetails并替换

将转移资本合并为[转移资本]

选择sumDD.TransferdCapital 来自案例详细信息CDD DD.casetailsid=CDD.casetailsid上作为DD的内部联接文档详细信息 其中C.CaseID=CDD.CaseID作为[TransferdCapital]


此子查询中不可能出现DD.casetailsid=C.casetailsid的情况,因为C.casetailsid不在分组中。凯西德是。如果需要不同级别的总计,请更改此id。

由于您声明每个CaseDetails行的多个DocumentDetails行会为Capital和其他某些列生成不正确的值,因此可以获取子查询中的大部分数据,并在外部查询中加入DocumentDetails表以获取其正确的总和。通过在执行所有其他求和/分组后连接DocumentDetails表,可以确保连接到子查询结果集的每个DocumentDetails行不会被其他连接表相乘

select
sum(DD.TransferedCapital) as [TransferedCapital]
,r.Name
,r.ClientId
,r.SetId
,r.CaseId
,r.ClientCaseNumber
,r.[Capital] 
,r.[Other]
,r.[InterestsU]
,r..AccountType
,r.[Overpayment]
,r.ProvisionValue
,r.OpDate
,r.DateImported
from (
    select
    D.Name
    ,C.ClientId
    ,C.SetId
    ,C.CaseId
    ,C.ClientCaseNumber
    ,sum(PDH.Capital) as [Capital] 
    ,sum(PDH.Other) as [Other]
    ,sum(PDH.InterestsU) as [InterestsU]
    ,PH.AccountType
    ,sum(PDH.Overpayment) as [Overpayment]
    ,PROV.ProvisionValue
    ,PH.OpDate
    ,C.DateImported
    ,C.CaseDetailsId
    FROM CaseDetails as C
    join DebtorDetails as D on C.CaseDetailsId = D.CaseDetailsId
    join PaymentCaseHistory as PH on C.CaseDetailsId = PH.CaseDetailsId
    join PaymentDocumentHistory as PDH on PH.PaymentId = PDH.PaymentCaseHistoryId
    join ClientProvision as PROV on C.ProductId = PROV.ClientProductId

    WHERE (PH.IsDeleted is NULL or PH.IsDeleted <> 'True') and C.ProductId = PROV.ClientProductId and C.ClientId= '2'
    GROUP by D.Name, C.ClientId, C.CaseId, C.SetId, C.ClientCaseNumber,  PH.AccountType, PDH.Overpayment, PH.OpDate, C.DateImported, PROV.ProvisionValue
     ) r
join DocumentDetails as DD on r.CaseDetailsId = DD.CaseDetailsId
ORDER by r.OpDate

您是否考虑过将相乘的结果除以计数?考虑过这一点,但我将其视为最终解决方案,因为其他方法都不起作用。考虑到您的数据模型,我认为您必须在使用两个查询或使用计数之间进行选择。您在实体之间是否有其他链接?我在案例详细信息中统计了4种不同的1对多关系。这很可能会导致像您遇到的那样的聚合错误。如果您在DD和PDH之间有关系,那么您只能更改from部分,并且可能不需要子查询。不幸的是,不需要。这种链接方式是这些表之间唯一可能的。