有点糊涂了,关于这个SQL的统计为什么结果不正确

likesome 2004-07-23 06:48:11
发票库 kp_bill  字段:billcode,billmon,ispay
发票明细库 kp_table_list 字段: tabcode,billcode,isbill
表库kp_table 字段: tabcode roadcode

三个库关系如下
1、kp_bill 与kp_table_list是根据billcode一对多的关系
2、kp_table_list 与kp_table是根据tabcode多对一的关系

我现在要根据roadcode 统计 billmon 不知为什么,我下面的语句竟重复统计的kp_bill的billmon,其结果远大于实际结果,这个语句应怎样写

下面是我写的


SELECT Sum(c.billMon) AS Mon FROM Kp_Table_List a INNER JOIN Kp_Table b ON a.TabCode = b.TabCode INNER JOIN Kp_Bill c ON a.BillCode=c.BillCode WHERE b.RoadCode='51' AND a.isBill=1 AND c.isPay = 0









...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
likesome 2004-07-23
  • 打赏
  • 举报
回复
TO zjcxc(邹建)
果然是高手,这个结果完全正确


TO swordmanli
你讲得也很有道理,看来原来我的表设计不是太合理

zjcxc 元老 2004-07-23
  • 打赏
  • 举报
回复
--没有数据,根据楼主的查询语句写的结果

SELECT Sum(c.billMon) AS Mon
FROM Kp_Bill c
where c.isPay = 0
and exists(
SELECT 1 FROM Kp_Table_List a
INNER JOIN Kp_Table b ON a.TabCode = b.TabCode
WHERE b.RoadCode='51' AND a.isBill=1
and a.BillCode=c.BillCode)
swordmanli 2004-07-23
  • 打赏
  • 举报
回复
我认为楼主的这种情况是无法得到如上要求的结果的,因为逻辑上有矛盾

三个库关系如下
1、kp_bill 与kp_table_list是根据billcode一对多的关系
2、kp_table_list 与kp_table是根据tabcode多对一的关系

kp_bill 一对多 kp_table_list 多对一 kp_table,现在根据kp_table统计kp_bill,这是做不到的,因为关系已经打乱了
例如:kp_table 中有A, B, kp_table_list中分解成A1,A2 和B1, B2,然后到了kp_bill重新组合成C1对应A1、B1, C2对应A2、B2,那现在项统计A在kp_bill中的数据是无法得到了,因为你不知道A1,A2个在C1,C2中占据的比例。

结论,楼主必须重新设计数据结构
建议:在中间表kp_table_list也存储你要统计的数据billmon,如上例如果C1.billmon = 100万,那么A1.billmon + B1.billmon 也要等于100万,这样你统计的时候,直接统计到中间表就够了。
老宛 2004-07-23
  • 打赏
  • 举报
回复
楼主提供一下测试数据
WangZWang 2004-07-23
  • 打赏
  • 举报
回复
试试:

SELECT Sum( distinct c.billMon) AS Mon FROM Kp_Table_List a
INNER JOIN Kp_Bill c ON a.BillCode=c.BillCode
INNER JOIN Kp_Table b ON a.TabCode = b.TabCode
WHERE b.RoadCode='51' AND a.isBill=1 AND c.isPay = 0

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧