起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3422|回复: 11

[结贴] 如何避免笛卡尔积?

[复制链接]

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
发表于 2014-8-12 14:39:15 | 显示全部楼层 |阅读模式
本帖最后由 cotyane 于 2014-8-12 14:41 编辑

我在做个项目,有三个概念,第一个是“项目”,里面有项目编号、名称、项目金额等信息;第二个是“收款”,有项目编号、收款日期、收款金额等信息;第三个是“项目付款”,有项目编号、付款日期和付款金额等信息。现在我做了个报表,用项目编号做关联,查询收款和付款,以及差额。由于收款有很多笔,付款也有很多笔,就出现了笛卡尔积,比如收款有三笔,付款有四笔,就出来了十二笔。用子查询也得不到想要的结果,数据不知从何而来。请教一下:我该如何实现真实的报表?

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-12 14:52:38 | 显示全部楼层
ksql查询的语句如下(用的“收款合计”和“付款合计”):
select BU_XMXXB.fSZDW as fSZDW,BU_XMXXB.fXMJL as fXMJL,BU_XMXXB.fXMMC as fXMMC,BU_XMXXB.fXMJE as fXMJE,(sum(BU_XMSKB.fKPJE)) as SUMSKJE,(sum(BU_XMYSZFB.fJE)) as SUMFKJE
    from BU_XMXXB BU_XMXXB
     optional  join BU_XMSKB BU_XMSKB on BU_XMXXB.fXMBH = BU_XMSKB.fXMBH
     optional  join BU_XMYSZFB BU_XMYSZFB on BU_XMXXB.fXMBH = BU_XMYSZFB.fXMBH
    where ( BU_XMSKB.fSKRQ >= :p1 AND BU_XMSKB.fSKRQ <= :p2 ) AND ( BU_XMYSZFB.fFKRQ >= :p1 AND BU_XMYSZFB.fFKRQ <= :p2 ) AND BU_XMXXB.fSZDW = :p3
    group by BU_XMXXB.fSZDW, BU_XMXXB.fXMBH
    order by BU_XMXXB.fXMJL asc
收款日期和付款日期都大于p1小于p2,以“所属单位”和“项目编号”汇总,以“项目经理”排序。请教各位了!
回复 支持 反对

使用道具 举报

发表于 2014-8-12 15:02:41 | 显示全部楼层
试试两两查询 ,即:select * from  (select distinct a.id,sum(B) from A optional  join B on A=B) c  optional  join D on C.id=D.id
只是思路,楼主应该看得懂吧
回复 支持 反对

使用道具 举报

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-12 15:25:54 | 显示全部楼层
暗夜的忧伤 发表于 2014-8-12 15:02
试试两两查询 ,即:select * from  (select distinct a.id,sum(B) from A optional  join B on A=B) c  op ...

好象不行啊。我试过以“项目信息表”作为中介,其与收款表和付款表分别两两联接,得到的结果一样的。
回复 支持 反对

使用道具 举报

发表于 2014-8-12 15:28:47 | 显示全部楼层
cotyane 发表于 2014-8-12 15:25
好象不行啊。我试过以“项目信息表”作为中介,其与收款表和付款表分别两两联接,得到的结果一样的。 ...

我的思路是永远保证主表的ID是唯一的
回复 支持 反对

使用道具 举报

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-12 15:29:16 | 显示全部楼层
暗夜的忧伤 发表于 2014-8-12 15:02
试试两两查询 ,即:select * from  (select distinct a.id,sum(B) from A optional  join B on A=B) c  op ...

按照您的思路,先将收款表与项目信息表联结,得出三行收款数据,然后再以项目编号与付款表联结,有四行付款数据,这就又出来十二行了。还是我没看懂您的意思?
回复 支持 反对

使用道具 举报

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-12 15:32:10 | 显示全部楼层
暗夜的忧伤 发表于 2014-8-12 15:28
我的思路是永远保证主表的ID是唯一的

项目信息表中数据是唯一的,但收款和付款中都不是唯一的。ksql可以左联结和右联结吗?
回复 支持 反对

使用道具 举报

发表于 2014-8-12 16:11:26 | 显示全部楼层
cotyane 发表于 2014-8-12 15:32
项目信息表中数据是唯一的,但收款和付款中都不是唯一的。ksql可以左联结和右联结吗? ...

你是做成 项目 付款和 收款和 还是 项目 付款 收款?
第一种 应该就可以保存项目的ID唯一 第二种就不行了
回复 支持 反对

使用道具 举报

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-12 16:40:57 | 显示全部楼层
暗夜的忧伤 发表于 2014-8-12 16:11
你是做成 项目 付款和 收款和 还是 项目 付款 收款?
第一种 应该就可以保存项目的ID唯一 第二种就不行了 ...

谢谢,我再试。
回复 支持 反对

使用道具 举报

7

主题

43

帖子

1332

积分

金牌会员

Rank: 6Rank: 6

积分
1332
QQ
 楼主| 发表于 2014-8-13 08:48:47 | 显示全部楼层
试了一晚,终于利用笨办法搞定,用包括笛卡尔积的数,付款总数除以收款次数即是付款,收款总数除以付款数即得收款。上面老师教的办法总保持不了数据唯一,也许是我不会。
好了,解决就行了,申请结贴。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-5 01:21 , Processed in 0.085243 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表