0

我有两个表,MasterChild.我需要表中列Cash的总和,我也指的是Child表匹配某些条件。加上内部加入群组

Master表:

ID CASH  BillDate  
1  100   22-02-2014  
2  200   22-02-2014 

Child表:

ChildID MasterID 
1  1 
2  1 
3  2 

我的查询:

select CONVERT(varchar,BillDate,103) as BillDate,SUM(cash)as ByCash 
from childdetails CD 
inner join MasterDetails MD on MD.ID=CD.MasterID 
where CONVERT(varchar,BillDate,103)='22/02/2014' 
group by BillDate 

我的错误输出:

BillDate  ByCash 
22/02/2014  400 

正确的输出应为ByCash 300,但我不知道为什么它被计算为400

+0

100 + 100 + 200 = 400。你如何得到300?您排除了哪些子记录? – jpw

+0

不要将日期转换为字符串。将字符串转换为日期。 – usr

+0

我已经明确提及我需要Master表中的'Cash'列的总和纯粹取决于主表..... – Pradeep

回答

0

的问题似乎是,你的孩子表计数MasterID两次。请尝试选择子表的CTE与ROW_NUMBER,通过MasterID分区过滤掉重复:

select 
    CONVERT(varchar,BillDate,103) as BillDate, 
    SUM(cash)as ByCash 
from (
     select *, 
      row_number() over(partition by MasterID order by ChildID) dedupe 
     from childdetails 
     ) CD inner join MasterDetails MD on MD.ID=CD.MasterID 
where 
    CONVERT(varchar,BillDate,103)='22/02/2014' 
    and CD.dedupe = 1 
group by BillDate 
+0

是的,我知道子表中的masterid重复了两次,所以只有我没有得到确切的输出,但你的查询是正确的..你可以解释分配CD.dedupe = 1的目的在哪里条件.....让我知道 – Pradeep

+0

CD.dedupe = 1返回一系列匹配MasterID中的第一个。可能有MasterID没有重复的情况。 CD.dedupe = 1也会返回。 –

+0

如果我已经回答了您的问题,请考虑将我的答案标记为答案并对其进行投票。谢谢:) –

0

也许这是你在找什么:

SELECT BillDate, SUM(Cash) FROM MasterDetails GROUP BY BillDate 

如果不是,请澄清你的预期产出是什么。

+0

我需要匹配子表强制为了获得其他某些条件,所以根据您的查询我可以得到输出,但我需要匹配子表得到确切的输出.... – Pradeep

+0

@Pradeep我现在觉得愚蠢,但我没有完全得到你想要的输出结果。如果你可以添加你想要的输出的例子,我相信这可以解决。 – jpw

+0

实际的问题是在子表中重复的masterid,我已经使用加入组,所以我现金为400 .... – Pradeep