2013-11-25 22 views
0

我有这样的查询需要的一点点帮助整理查询

SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,sum(CDV.TransferedCapital) as [TransferedCapital] 
,sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [WithdrawValue] 
,sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [Left] 
,(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100) as [Withdraw%] 
,sum(CDV.PaymentValue) as [PaymentValue] 
from 
CaseDetailsView as CDV 
join CaseActionHistory as CA on CA.CaseDetailId = CDV.CaseDetailsId 
join PaymentCaseHistory as PCH on PCH.CaseDetailsId = CDV.CaseDetailsId 
join PaymentSession as PS on PS.SessionId = PCH.SessionId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName 
order by 
CDV.SetId 

而且我得到了“小”(读作:巨大的)问题,完成它。

我需要添加这样的领域:

DATEPART(周,PS.SessionDate)

如果没有这一个简单的查询工作完美。

加入这一个我喜欢的东西后:

SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,sum(CDV.TransferedCapital) as [TransferedCapital] 
,sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [WithdrawValue] 
,sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [Left] 
,(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100) as [Withdraw%] 
,sum(CDV.PaymentValue) as [PaymentValue] 
,datepart(week,PS.SessionDate) as [SessionDate] 
from 
CaseDetailsView as CDV 
join CaseActionHistory as CA on CA.CaseDetailId = CDV.CaseDetailsId 
join PaymentCaseHistory as PCH on PCH.CaseDetailsId = CDV.CaseDetailsId 
join PaymentSession as PS on PS.SessionId = PCH.SessionId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName, datepart(week, PS.SessionDate) 
order by 
CDV.SetId 

但是查询没有显示所有值。当然这是因为使用“内连接”。

但是,当我更换内与左连接加入象下面这样:

SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,sum(CDV.TransferedCapital) as [TransferedCapital] 
,sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [WithdrawValue] 
,sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end) as [Left] 
,(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100) as [Withdraw%] 
,sum(CDV.PaymentValue) as [PaymentValue] 
,datepart(week,PS.SessionDate) as [SessionDate] 
from 
CaseDetailsView as CDV 
join CaseActionHistory as CA on CA.CaseDetailId = CDV.CaseDetailsId 
left join PaymentCaseHistory as PCH on PCH.CaseDetailsId = CDV.CaseDetailsId 
left join PaymentSession as PS on PS.SessionId = PCH.SessionId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName, datepart(week, PS.SessionDate) 
order by 
CDV.SetId 

值相乘得到。

想法?


基础上尝试,测试等等等等我完成了某事象:

SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,COALESCE(sum(CDV.TransferedCapital),0) as [TransferedCapital] 
,COALESCE(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [WithdrawValue] 
,COALESCE(sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [Left] 
,COALESCE((sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100),0) as [Withdraw%] 
,COALESCE(sum(PCH.PaymentValue),0) as [PaymentValue] 
,COALESCE(datediff(week,CDV.DateImported, PS.SessionDate),0) as [Week] 
from 
CaseActionHistory as CA 
join CaseDetailsView as CDV on CA.CaseDetailId = CDV.CaseDetailsId 
join PaymentCaseHistory as PCH on PCH.ActionArchiveId = CA.CaseActionId 
join PaymentSession as PS on PS.SessionId = PCH.SessionId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
and 
(CDV.SetId = @SetId or @SetId IS NULL) 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName, datediff(week,CDV.DateImported, PS.SessionDate) 
order by 
CDV.SetId, datediff(week,CDV.DateImported, PS.SessionDate) 

本身做工不错查询。我只是需要它里面一两件事:

的行已显示

,COALESCE(sum(CDV.TransferedCapital),0) as [TransferedCapital] 
,COALESCE(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [WithdrawValue] 
,COALESCE(sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [Left] 
,COALESCE((sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100),0) as [Withdraw%] 
,COALESCE(sum(PCH.PaymentValue),0) as [PaymentValue] 

总和整个SETID。我想过联盟,但它可能工作?


查询与UNION:BY子句

SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,COALESCE(sum(CDV.TransferedCapital),0) as [TransferedCapital] 
,COALESCE(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [WithdrawValue] 
,COALESCE(sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [Left] 
,COALESCE((sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100),0) as [Withdraw%] 
,COALESCE(sum(PCH.PaymentValue),0) as [PaymentValue] 
,COALESCE(datediff(week,CDV.DateImported, PS.SessionDate),0) as [Week] 
from 
CaseActionHistory as CA 
join CaseDetailsView as CDV on CA.CaseDetailId = CDV.CaseDetailsId 
join PaymentCaseHistory as PCH on PCH.ActionArchiveId = CA.CaseActionId 
join PaymentSession as PS on PS.SessionId = PCH.SessionId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
and 
(CDV.SetId = @SetId or @SetId IS NULL) 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName, datediff(week,CDV.DateImported, PS.SessionDate) 
UNION ALL 
SELECT 
CDV.SetId 
,CDV.DateImported 
,CDV.ProductName 
,COALESCE(sum(CDV.TransferedCapital),0) as [TransferedCapital] 
,COALESCE(sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [WithdrawValue] 
,COALESCE(sum(CDV.TransferedCapital)-sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end),0) as [Left] 
,COALESCE((sum(case when CA.CaseActionDefinitionId = 87 then CDV.TransferedCapital else 0 end)/sum(CDV.TransferedCapital)*100),0) as [Withdraw%] 
,COALESCE(sum(CDV.PaymentValue),0) as [PaymentValue] 
,NULL 
from 
CaseActionHistory as CA 
join CaseDetailsView as CDV on CA.CaseDetailId = CDV.CaseDetailsId 
where 
(CDV.ClientId = @ClientId or @ClientId IS NULL) 
and 
(CA.IsDeleted IS NULL or CA.IsDeleted <> 'True') 
and 
(CDV.SetId = @SetId or @SetId IS NULL) 
group by 
CDV.SetId, CDV.DateImported, CDV.ProductName 
order by 
CDV.SetId 
+0

你知道连接是如何工作的吗? - http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg –

+0

是的,我有,但仍然没有解决我的问题。如果我可以自己管理,我不会打扰你。 – glaeran

+0

我不明白“整个SetId”是什么意思。你能解释一下吗? –

回答

0

更改组:

group by CDV.SetId, CDV.DateImported, CDV.ProductName, PS.SessionDate 
+0

没有。不会改变任何东西。数值仍然乘以相同的星期不计为1,因此例如我有相同的SetId 36个星期的3条记录 – glaeran

+0

您可以发布有关您的ERD的图像? –

+0

不能遗憾。但是我可以告诉你,查询中使用的关系是唯一可以使用的关系。 – glaeran

0

你可以试试这个?

我无法尝试这个,因为我没有SQLServer在工作。

select TBL1.* 
     ,(TBL1.TRANSFEREDCAPITAL + TBL1.WITHDRAWVALUE + TBL1.left + TBL1.WITHDRAW% + TBL1.PAYMENTVALUE) as [TOTALSUM] 
from (select CDV.SETID 
       ,CDV.DATEIMPORTED 
       ,CDV.PRODUCTNAME 
       ,COALESCE(sum(CDV.TRANSFEREDCAPITAL), 0) as [TRANSFEREDCAPITAL] 
       ,COALESCE(sum(case 
           when CA.CASEACTIONDEFINITIONID = 87 then 
           CDV.TRANSFEREDCAPITAL 
           else 
           0 
          end), 0) as [WITHDRAWVALUE] 
       ,COALESCE(sum(CDV.TRANSFEREDCAPITAL) - sum(case 
                  when CA.CASEACTIONDEFINITIONID = 87 then 
                   CDV.TRANSFEREDCAPITAL 
                  else 
                   0 
                 end), 0) as [left] 
       ,COALESCE((sum(case 
           when CA.CASEACTIONDEFINITIONID = 87 then 
            CDV.TRANSFEREDCAPITAL 
           else 
            0 
          end)/sum(CDV.TRANSFEREDCAPITAL) * 100), 0) as [WITHDRAW%] 
       ,COALESCE(sum(PCH.PAYMENTVALUE), 0) as [PAYMENTVALUE] 
       ,COALESCE(DATEDIFF(WEEK, CDV.DATEIMPORTED, PS.SESSIONDATE), 0) as [WEEK] 
     from CASEACTIONHISTORY as CA 
     join CASEDETAILSVIEW as CDV 
     on  CA.CASEDETAILID = CDV.CASEDETAILSID 
     join PAYMENTCASEHISTORY as PCH 
     on  PCH.ACTIONARCHIVEID = CA.CASEACTIONID 
     join PAYMENTSESSION as PS 
     on  PS.SESSIONID = PCH.SESSIONID 
     where (CDV.CLIENTID = @CLIENTID or @CLIENTID is null) 
       and (CA.ISDELETED is null or CA.ISDELETED <> 'True') 
       and (CDV.SETID = @SETID or @SETID is null) 
     group by CDV.SETID 
       ,CDV.DATEIMPORTED 
       ,CDV.PRODUCTNAME 
       ,DATEDIFF(WEEK, CDV.DATEIMPORTED, PS.SESSIONDATE) 
     order by CDV.SETID 
       ,DATEDIFF(WEEK, CDV.DATEIMPORTED, PS.SESSIONDATE)) as TBL1; 
+0

列PAYMENTSESSION.SessionDate在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中+列的名称无效SessionDate +无法连接CDV.SetId – glaeran

+0

关于最后一次SessionDate的课程“order by ”。请现在测试。 –

+0

“TBL1.SessionDate无效”,但我刚删除了子查询中的空格,但它仍然要求所有字段都在主查询中,以便查询结果与我的相同(乘以值:)) – glaeran

0

看看查询,您似乎没有在您的新SessionDate字段中的任何位置使用PaymentCaseHistory(PCH)或PaymentSession(PS)。

所以最明显的第一个结论是,上面那两个表包含来自CaseDetailsView和CaseActionHistory的每个先前结果的许多不同的星期数。

你可以用MAX(DATEPART(WEEK,PS.SessionDate))将你的datepart(week,PS.SessionDate)替换为[SessionDate]来试试看看会发生什么。另外,要按它分组,您需要在GROUP BY子句中添加相同的条件。IE:

SELECT .... datepart(week,PS.SessionDate) as [SessionDate] 
FROM .... 
GROUP BY ... , datepart(week,PS.SessionDate) 
+0

不幸的是,这不是真的为什么我想要..值仍然不同于预期。我想它与“连接”子句相关。更重要的是(如果它会改变什么)我发现有一种方法可以使用'ArchiveId'列将CaseActionHistory与PaymentSession表连接起来。 – glaeran

+0

更新后的第一篇文章,其他信息。请看看。 – glaeran