求 mysql 语言。语言表达非常不好,所以有举例,不明白的,可以提问。就这么点分了,希望得空的,帮忙看看

一共是A,B,C三个表,其中A表有a,b列,B表有a,c列,C表有a,d列。其中A表的a列为其主键,有且仅有一个。B表和C表的a列都是从A表中的a列中抽调生出的数值,有可能重复或者缺少,但不可能多出A表a列的数值。B表不重复的a列包含C表不重复的a列。B表不重复的a列值c的和大于或者等于B表不重复的a列值c的和。a,b,c,d列的值全为数字。

现在需要,“从B表中找出重复的a列,把它的c列相加的值”然后减去“从C表中找出重复的a列,把它的d列相加的值”,再乘以相对应的A表的b列,其中A,B,C三表的a列的值均相等。最后根据A表中的所有的a列,算出总和。

比如:A表: a b
1 11
2 12
3 13
4 14
5 15
B表: a c
1 21
1 22
4 23
5 24
4 25
2 26
1 27

C表: a d
1 31
1 32
4 33
B、C表的a列均存在于A表的a列,且C表的a列被包含于B表的a列,例如B表的a列没有3,则C表的a列绝对不可能有3。
第一步:
B表,重复的a列求c列的和: a c
1 70
2 26
4 48
5 24
C表,重复的a列求c列的和: a d
1 63
4 33
第二步:B表所求的和减去C表所求的和,然后乘于相对应的A表的b列的值,最后相加,求总和。
(70-63)*11+26*12+(48-33)*14+24*15=...
求mysql语言。

这个比较复杂,需要建立一些临时表:
第一步:
create temporary table tmp_b(a int, csum int);
insert into tmp_b (select a, sum(c) from b group by a);

create temporary table tmp_c(a int, dsum int);
insert into tmp_c (select a, sum(d) from c group by a);

第二步:
tmp_d 表用于保存 : B表所求的和减去C表所求的和,然后乘于相对应的A表的b列的值
create temporary table tmp_d(a int, ss int);
insert into tmp_d (select tmp_b.a,
(case when dsum is null then tmp_b.csum* a.b else (tmp_b.csum - tmp_c.dsum) * a.b end)
from (tmp_b left join tmp_c on tmp_b.a=tmp_c.a) left join a on a.a = tmp_b.a );

最后,将d表之中计算的值在加起来。
select sum(ss) from tmp_d;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-20
第一步好像很简单,分别用下面的SQL实现:
SELECT a,SUM(c) FROM B表 GROUP BY a;
SELECT a,SUM(d) FROM C表 GROUP BY a;
现在才发现你的表名和字段名是一样的,这样写出的语句怕混淆,实际中建议不要这样做。

第二步始终看不明白你的意思,试着猜猜看~
SELECT SUM((BB.c-CC.d)*AA.b) FROM 表A AS AA,
(SELECT a,SUM(c) AS c FROM B表 GROUP BY a) AS BB,
(SELECT a,SUM(d) AS d FROM C表 GROUP BY a) AS CC
WHERE AA.a=BB.a AND AA.a=CC.c
不知道你的MYSQL是什么版本,低于版本不支持嵌套,那样需要使用临时表追问

我是想用一句mysql语言做出以上的计算....版本5点几吧,

相似回答