请问:如何用select对这两个表进行合并?(前一提问有误!!)(100分)

  • 主题发起人 主题发起人 小宇飞刀
  • 开始时间 开始时间

小宇飞刀

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下二表:
YHDA.DB | GZ.DB
|
户号 姓名 。。。。| 户号 项目 金额 .....
0001 张三 | 0001 基本工资 700
0002 李四 | 0001 职务工资 500
0003 王五 | 0001 奖金 600
0004 谢天 | 0002 基本工资 200
0005 刘有睛 | 0002 职务工资 600
. | 0002 奖金 500
. | 0003 基本工资 200
. | 0003 职务工资 300
. | 0003 奖金 300
. | 。。。

如何把它们合并成如下表:
ZGGZ.DB
户号 姓名 基本工资 职务工资 奖金 合计工资
0001 张三 700 500 600 1800
0001 李四 200 600 500 1300
0001 王五 200 300 300 800
0002 谢天 ..........
.....
 
如果光固定 基本工资 职务工资 奖金 还好办
要是不固定,出现其他工资就不好办了,要动态生成了
 
select yhda.户号, yhda.姓名, gz.项目, gz.金额, ...... from yhda, gz where
yhda.户号=gz.户号
 
如果就你这样的情况,使用子查询就行了.
 
有一个表的结构和内容如下:
客户名 产品 数量
A1 B1 10
A1 B2 20
A1 B3 15
A2 B1 10
A2 B2 15
A2 B3 20
A3 B1 20
A3 B2 30
A3 B3 20
A1 B1 18
A2 B2 20
... ... ...
将这个表分客户名和产品名汇总后横向显示,如
客户名 B1 B2 B3 数量合计
A1 汇总数 ... ... B1+B2+B3
A2 汇总数 ... ... B1+B2+B3
A3 汇总数 ... ... B1+B2+B3
下面分别用InterBase和Mssql的语法写一遍:
1.MSSQL如下:
SELECT kehu,
SUM(case when chanpin='b1' then num else 0 end) as b1,
SUM(case when chanpin='b2' then num else 0 end) as b2,
SUM(case when chanpin='b3' then num else 0 end) as b3,
SUM(case when chanpin='b1' then num else 0 end)
+SUM(case when chanpin='b2' then num else 0 end)
+SUM(case when chanpin='b3' then num else 0 end) as HEJI
FROM table
GROUP BY kehu
ORDER BY kehu.//通过

2.在Interbase下通过.
SELECT DISTINCT(t1.kenu)
(SELECT sum(num) FROM a123 t WHERE t.chanpin='b1' and t.kehu=t1.kehu) as b1,
(SELECT sum(num) FROM a123 t WHERE t.chanpin='b2' and t.kehu=t1.kehu) as b2,
(SELECT sum(num) FROM a123 t WHERE t.chanpin='b3' and t.kehu=t1.kehu) as b3,
((SELECT sum(num) FROM a123 t WHERE t.chanpin='b1' and t.kehu=t1.kehu)
+(SELECT sum(num) FROM a123 t WHERE t.chanpin='b2' and t.kehu=t1.kehu)
+(SELECT sum(num) FROM a123 t WHERE t.chanpin='b3' and t.kehu=t1.kehu) as ttt
FROM a123 t1
GROUP BY kehu
ORDER BY kehu
//通过,你把它改一下就可以用了
 
请看这里:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=143878
你把其中cytown的答案好好研究一下就懂了
 
问题是工资项目是不固定的,有的单位项目多,而有的单位项目较少,
如果是固定的话直接做为字段就可以了。
 
工资项目不固定, 那可有点麻烦,
恐怕要先读表得到工资项目, 再动态生成SQL语句了, 是有点复杂了
与其如此, 不如读这两个表到两个二维数组中, 自己写点代码来生成得了。
反正现在的内存大, CPU又快, 就算在内存中遍历整个表的速度也很快的。
 
create table xxx as (select a.户号,a.姓名,b.基本工资,b.职务工资,b.奖金,b.合计工资
from "YHDA a","GZ b" where a.户号=b.户号);
 
明天我再去想想刚才说的更好的方法,
 
非要这么设计表吗?干脆就设计成ZGGZ表形式好了,不一定每个字段都要填满吧,或者把所有
工资项另设为一张表,这样项目增加也没关系了
 
SUM(case when chanpin='b1' then num else 0 end) as b1
谁能帮我解释一下num是什么意思!
 
>>工资项目不固定
不可能完成
而且这种表结构是极不合理的
顶多是用procedure返回动态的表
 
to 昱昱:能否注释一下?
 
提供你一种方案:

DELPHI有专门的多维动态分析控件组来处理类似问题,你这个情况是其中比较简单的一种情形。
在Decision Cube 控件组上:
令DecisionQuery1.SQL='select 户号,户名,项目,sum(金额) from GZ,YHDA where GZ.户号=YHDA.户号 ';
DecisionQuery1.DatabaseName:=所连的数据库别名;
DecisionCube1.DataSet:=DecisionQuery1;
双击DecisionCube1,把 户号,户名,项目的TYPE 设为Dimension,sum(金额) 设为Sum;
DecisionSource1.DecisionCube:=DecisionCube1;
DecisionGrid1.DecisionSource:=DecisionSource1;

则DecisionGrid1显示的内容即是你所要的内容,不用编写一句代码
 
这个问题,如果用SQL的视图做的话,太简单了
你编C/S还用本地数据库?
若用SQL后台数据库的话。我可告诉你。
 
A Couple of Points:

1 数据库结构设计上似乎过于Normalization化。这种结构设计我们公司也曾尝试过,
好处是易于增加新的Salary Items,有一定的灵活性,但是在使用数据库上则增加编
程工作量。原先一句SQL搞店的现在可能要一段Stored Procedure或几个Views才能解
决。建议(将来)不妨将所有员工工资做成一行Record。

2 就目前数据结构,建议作一Stored Procedure或许还需一临时表。Stored Procedure经
Compiled,优化,易于使用,速度也快。

Happy Programming!
 
如果是ACCESS数据库,应该可以用交叉表,若是MS SQL Server就麻烦点
写个存储过程吧,大致如此
insert into #zgzb(select 户号,sum(金额) 基本工资,0 职务工资, 0 奖金 group by 户号
union select 户号,0 基本工资,sum(金额) 职务工资, 0 奖金 group by 户号
union select 户号,0 基本工资,0 职务工资, sum(金额) 奖金 group by 户号)AA
insert into zgzb (select 户号,sum(基本工资),sum(职务工资),sum(奖金)group by 户号)
你的另外一个电费收费问题也可照此解决
 
不好意思,每个后面少加了where 分别是(项目=基本工资,项目=职务工资,项目=奖金)
 
后退
顶部