做了几年的数据库系统,一直都用
UNION进行表间组合查询,
UNION ALL很少用到。今天因为统计数据时出现了
2.4的误差,把几万条数据都导出来慢慢分析,才找到问题所在,原来都是
UNION和
UNION ALL惹的祸。
门诊收费包含两个表:处方表和医技表,对于每一张收费发票,可能会只有药品处方、或者只有医技收入,或者两者皆有。这样,在进行统计的时候,就需要将这两张表进行组合统计查询,自然要使用 UNION查询了,我最初写的 SQL语句是这样的:
Select d.FPHM,d.BRXM,d. HJRY, sum(HJJE) as ZJE
from(
select FPHM,BRXM,HJRY,HJJE from T_CF where KFRQ >= 开始时间 and KFRQ < 结束时间
union
select FPHM,BRXM,HJRY,HJJE from T_YJ where KDRQ >= 开始时间 and KDRQ < 结束时间
)d
group by d.FPHM,d.BRXM,d. HJRY
order by d.FPHM
一直的偶然机会没有出现,当初写这条语句的时候并没有料到会产生今天的错误。当 T_CF和 T_YJ表中刚好查询出一模一样的 FPHM,BRXM,HJRY,HJJE时,那么 sum(HJJE)计算出来的就只有一个了,举个数据来说明下:
一个病人 A,在收费员 B那产生了一张门诊收费发票(发票号 00888),他的医药费用为 2.4元,同时医技费用也为 2.4元。按照上述 SQL语句,从 T_CF中查询出来的是: 00888, A, B,2.4 ,从 T_YJ中查询出的也是: 00888,A,B,2.4;但是计算出来的 SUM(HJJE)却还是 2.4,并不是我们期待的 4.8。
问题出在哪儿呢?我是百思不得其解,直到后面去看 UNION的查询原来才看出端倪所在: UNION指令的目的是将两个 SQL语句的结果合并起来,用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
在 SQL大全里提到了另一个关键词: UNION ALL,以前学数据库的时候好像没怎么注意这个东西,现在不得不好好去研究下了: UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。
终于找到问题之所在了,将 SQL语句改成:
Select d.FPHM,d.BRXM,d. HJRY, sum(HJJE) as ZJE
from(
select FPHM,BRXM,HJRY,HJJE from T_CF where KFRQ >= 开始时间 and KFRQ < 结束时间
union all
select FPHM,BRXM,HJRY,HJJE from T_YJ where KDRQ >= 开始时间 and KDRQ < 结束时间
)d
group by d.FPHM,d.BRXM,d. HJRY
order by d.FPHM
执行测试,搞定!
其实是个很弱智的问题,以前没怎么注意,但是今天因为它浪费了我宝贵的一个多小时,谨以此文纪念那逝去的一个多小时,也给自己提个醒,要注意细节!
门诊收费包含两个表:处方表和医技表,对于每一张收费发票,可能会只有药品处方、或者只有医技收入,或者两者皆有。这样,在进行统计的时候,就需要将这两张表进行组合统计查询,自然要使用 UNION查询了,我最初写的 SQL语句是这样的:
Select d.FPHM,d.BRXM,d. HJRY, sum(HJJE) as ZJE
from(
select FPHM,BRXM,HJRY,HJJE from T_CF where KFRQ >= 开始时间 and KFRQ < 结束时间
union
select FPHM,BRXM,HJRY,HJJE from T_YJ where KDRQ >= 开始时间 and KDRQ < 结束时间
)d
group by d.FPHM,d.BRXM,d. HJRY
order by d.FPHM
一直的偶然机会没有出现,当初写这条语句的时候并没有料到会产生今天的错误。当 T_CF和 T_YJ表中刚好查询出一模一样的 FPHM,BRXM,HJRY,HJJE时,那么 sum(HJJE)计算出来的就只有一个了,举个数据来说明下:
一个病人 A,在收费员 B那产生了一张门诊收费发票(发票号 00888),他的医药费用为 2.4元,同时医技费用也为 2.4元。按照上述 SQL语句,从 T_CF中查询出来的是: 00888, A, B,2.4 ,从 T_YJ中查询出的也是: 00888,A,B,2.4;但是计算出来的 SUM(HJJE)却还是 2.4,并不是我们期待的 4.8。
问题出在哪儿呢?我是百思不得其解,直到后面去看 UNION的查询原来才看出端倪所在: UNION指令的目的是将两个 SQL语句的结果合并起来,用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
在 SQL大全里提到了另一个关键词: UNION ALL,以前学数据库的时候好像没怎么注意这个东西,现在不得不好好去研究下了: UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。
终于找到问题之所在了,将 SQL语句改成:
Select d.FPHM,d.BRXM,d. HJRY, sum(HJJE) as ZJE
from(
select FPHM,BRXM,HJRY,HJJE from T_CF where KFRQ >= 开始时间 and KFRQ < 结束时间
union all
select FPHM,BRXM,HJRY,HJJE from T_YJ where KDRQ >= 开始时间 and KDRQ < 结束时间
)d
group by d.FPHM,d.BRXM,d. HJRY
order by d.FPHM
执行测试,搞定!
其实是个很弱智的问题,以前没怎么注意,但是今天因为它浪费了我宝贵的一个多小时,谨以此文纪念那逝去的一个多小时,也给自己提个醒,要注意细节!