按关键字段如何合并多表

zjf27 2010-08-29 05:10:24
有6张表
表1:客户 接单重量
a 10
b 15

表2 客户 小机接单重量
a 5
b 5

表3 客户 大机接单重量
a 5
b 10

表4 客户 总完成量
b 8
c 20
表5 客户 小机完成量
b 4
c 8
表6 客户 大机完成量
b 4
c 12

要求获得一个查询结果:
客户 接单重量 小机接单重量 大机接单重量 总完成量 小机完成量 大机完成量

a 10 5 5
b 15 5 10 8 4 4
c 20 8 12
客户是关键字段
不知如何做
请求帮助


...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjf27 2010-08-30
  • 打赏
  • 举报
回复
第二步终于完成了
感谢josy

接下来如何在DBGridEH内每列合计了
zjf27 2010-08-29
  • 打赏
  • 举报
回复
非常感谢!知道了原理
实际上我这个程序相对复杂些,我的思路不知对不对
现有的表是3个
表a结构:
接单日期 客户 接单重量 机台类型

表b:
生产日期 客户 生产重量 机台类型

表c:
机台类型

其中机台类型的个数是变动的,内容也是变动的

要求的结果就是
在某一时间段内
客户 接单重量 机台类型a接单重量 机台类型b接单重量 机台类型c接单重量 ... 总生产重量 机台类型a重量 机台类型b重量 机台类型c重量 ...

我的想法如下
一.创建临时表,并存入数据

总接单表:
如果存在总接单表则删除
创建总接单表
客户 接单重量
按选定的时间段查询表a,插入到总接单表

创建各机台类型接单表2-n
用机台类型作循环创建
with data do
begin
close;
commandText:='select 机台类型 from 机台类型';
open;
first;
while not eof do
begin
如果存在接单fieldbyname('机台类型').asstring表 则删除
创建接单fieldbyname('机台类型').asstring表 ( 创建的字段是'客户 接单fieldbyname('机台类型').asstring')

next;
end;
end;

用机台类型作循环存入表a查询到的数据

总生产重量表:
如果存在总生产重量表则删除
创建总生产重量表
字段是'客户 生产重量'
按选定的时间段查询表b,插入到总生产重量表

创建各机台类型生产表2-n
用机台类型作循环创建
with data do
begin
close;
commandText:='select 机台类型 from 机台类型';
open;
first;
while not eof do
begin
如果存在生产fieldbyname('机台类型').asstring表 则删除
创建生产fieldbyname('机台类型').asstring表 ( 创建的字段是'客户 生产fieldbyname('机台类型').asstring')

next;
end;
end;

用机台类型作循环存入表b查询到的数据


二、合并所有表

估计各位看得比较吃力,我是凭感觉写的。第一步已经实现了。我这样的思路对不对,谢谢各位支持!










百年树人 2010-08-29
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[表1]') is not null drop table [表1]
go
create table [表1]([客户] varchar(1),[接单重量] int)
insert [表1]
select 'a',10 union all
select 'b',15
if object_id('[表2]') is not null drop table [表2]
go
create table [表2]([客户] varchar(1),[小机接单重量] int)
insert [表2]
select 'a',5 union all
select 'b',5
if object_id('[表3]') is not null drop table [表3]
go
create table [表3]([客户] varchar(1),[大机接单重量] int)
insert [表3]
select 'a',5 union all
select 'b',10
if object_id('[表4]') is not null drop table [表4]
go
create table [表4]([客户] varchar(1),[总完成量] int)
insert [表4]
select 'b',8 union all
select 'c',20
if object_id('[表5]') is not null drop table [表5]
go
create table [表5]([客户] varchar(1),[小机完成量] int)
insert [表5]
select 'b',4 union all
select 'c',8
if object_id('[表6]') is not null drop table [表6]
go
create table [表6]([客户] varchar(1),[大机完成量] int)
insert [表6]
select 'b',4 union all
select 'c',12

---查询---
SELECT
客户,
SUM(接单重量) AS 接单重量,
SUM(小机接单重量) AS 小机接单重量,
SUM(大机接单重量) AS 大机接单重量,
SUM(总完成量) AS 总完成量,
SUM(小机完成量) AS 小机完成量,
SUM(大机完成量) AS 大机完成量
FROM
(
SELECT 客户,接单重量,0 AS 小机接单重量,0 AS 大机接单重量,0 AS 总完成量,0 AS 小机完成量,0 AS 大机完成量 FROM 表1
UNION ALL
SELECT 客户,0,小机接单重量,0,0,0,0 FROM 表2
UNION ALL
SELECT 客户,0,0,大机接单重量,0,0,0 FROM 表3
UNION ALL
SELECT 客户,0,0,0,总完成量,0,0 FROM 表4
UNION ALL
SELECT 客户,0,0,0,0,小机完成量,0 FROM 表5
UNION ALL
SELECT 客户,0,0,0,0,0,大机完成量 FROM 表6
) T
GROUP BY 客户

---结果---
客户 接单重量 小机接单重量 大机接单重量 总完成量 小机完成量 大机完成量
---- ----------- ----------- ----------- ----------- ----------- -----------
a 10 5 5 0 0 0
b 15 5 10 8 4 4
c 0 0 0 20 8 12

(3 行受影响)
百年树人 2010-08-29
  • 打赏
  • 举报
回复
SELECT 
客户,
SUM(接单重量) AS 接单重量,
SUM(小机接单重量) AS 小机接单重量,
SUM(大机接单重量) AS 大机接单重量,
SUM(总完成量) AS 总完成量,
SUM(小机完成量) AS 小机完成量,
SUM(大机完成量) AS 大机完成量
FROM
(
SELECT 客户,接单重量,0 AS 小机接单重量,0 AS 大机接单重量,0 AS 总完成量,0 AS 小机完成量,0 AS 大机完成量 FROM 表1
UNION ALL
SELECT 客户,0,小机接单重量,0,0,0,0 FROM 表2
UNION ALL
SELECT 客户,0,0,大机接单重量,0,0,0 FROM 表3
UNION ALL
SELECT 客户,0,0,0,总完成量,0,0 FROM 表4
UNION ALL
SELECT 客户,0,0,0,0,小机完成量,0 FROM 表5
UNION ALL
SELECT 客户,0,0,0,0,0,大机完成量 FROM 表6
) T
GROUP BY 客户
zjf27 2010-08-29
  • 打赏
  • 举报
回复
发贴后空格都被自动删了,C客户后面的数字是完成量

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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