如何从三张表中查询出数据显示在一起 |
答題得分者是:timhuang
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
数据库为ACCESS
有表1(库存表) 字段 项目ID 项目名称 库存数量 表2(销售表) 字段 项目ID 项目名称 销售数量 表3(进库表) 字段 项目ID 项目名称 进库数量 注: 项目ID为唯一索引,三表中只要项目ID相同,那么肯定为同一项目。 销售数量和进库数量是要合计的,把项目ID相同的数量要合计在一起 库存数量不要合计,一个项目只会有一条库存数量记录 用何种查询语法,实现如下功能(项目进销存一览表) 字段 项目ID 项目名称 进库数量 库存数量 销售数量
------
我的编程起步于ktop,我将永远支持ktop |
kgt
高階會員 發表:17 回覆:308 積分:165 註冊:2002-03-13 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 試試, select 项目ID, 项目名称, sum(进库数量) as 进库, sum(库存数量) as 库存, sum(销售数量)as 销售 from
(
SELECT 项目ID, 项目名称, 进库数量, 0 as 库存数量, 0 as 销售数量
FROM 进库表
union all
SELECT 项目ID, 项目名称, 0, 库存数量, 0
FROM 库存表
union all
SELECT 项目ID, 项目名称, 0, 0, 销售数量
FROM 销售表
) as a
group by 项目ID, 项目名称
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我参照前辈的指教,根据自己的软件的实际情况,编写代码如下: begin ADOQuery1.Close; ADOQuery1.SQL.Text:=' select 药品ID,sum(入库数量)as 进库数量,库存数量,sum (数量) as 销售数量 ' ' from (SELECT 药品ID, 药品名称, 进库数量, 0 as 库存数量, 0 as 销售数量 from tb_yprk' ' union all ' ' SELECT ID, 项目名称, 0, 库存数量, 0 from tb_yp' ' union all ' ' SELECT 项目ID,项目名称, 0, 0, 数量 from tb_sf)as a ' ' group by 项目ID,项目名称' ; ADOQuery1.Open; 解释:入库表为 tb_rk 其中字段名为药品ID 药品名称 入库数量 库存表为tb_yp 其中字段名为ID 项目名称 库存数量 销售表为tb_sf 其中字段名为项目ID 项目名称 数量 上述三表中的药品ID ID 项目ID,均指的是同一个内容,只要这一栏位相同,那么记录就肯定是指的同一个记录(唯一索引) 药品名称和项目名称的内容只要是ID相同了,那么这两个记录也肯定是一模一样的。现在编绎是成功了,但是运行时我发现只运行了第一行,第二行的 ‘后面的都没运行,就跳到ADOQuery1.Open;
------
我的编程起步于ktop,我将永远支持ktop |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
经过showmessage测试发现是我搞错了,我只是把SQL.text人为的分成了几行,其实执行起来本来就是要视作一行的。
begin ADOQuery1.Close; ADOQuery1.SQL.Text:=' select 项目ID,项目名称,sum(入库数量)as 进库数量,sum(库存数量)as 库存数量,sum (数量) as 销售数量 ' ' from (SELECT 药品ID as 项目ID , 药品名称 AS 项目名称, 入库数量, 0 as 库存数量, 0 as 销售数量 from tb_yprk' ' union all ' ' SELECT ID as 项目ID, 项目名称, 0, 库存数量, 0 from tb_yp' ' union all ' ' SELECT 项目ID,项目名称, 0, 0, 数量 from tb_sf)as a ' ' group by 项目ID,项目名称' ; ADOQuery1.Open;先问一下,最后的那一句 as a这个起什么作用? 现在提示参数数量没有默认值。tb_sf中有数量这一个字段的 说实话我对里面的层次还没了解清楚,我不知道查询语句中的哪一个名称要和哪一个表的字段对应(因为虽然三个表中的字段内容是一模一样的,但各自在三个表中的名称是有一点区别的) 我在想,第一行中的项目ID和项目名称应该是从哪个表中来的呢?因为另外两个表中,项目ID不叫项目ID,一个叫ID一个叫药品ID(只要这三个内容相同,那么项目名称或者药品名称肯定是一模一样的。) 为什么这么叫呢,因为在库存表中,自动编号就等于ID值,在销售表中,取到库存中的ID值,就叫他项目ID。在入库表中取到ID值后叫他药品ID。 發表人 - ntjrr 於 2005/11/14 12:43:33
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
代码运行成功了,麻烦前辈看一下,我自己的代码有无不妥之处,或者说有无可以进一步优化的地方,谢谢!
begin ADOQuery1.Close; ADOQuery1.SQL.Text:=' select 项目ID,项目名称,sum(入库数量)as 进库数量,sum(库存数量)as 库存数量,sum(数量) as 销售数量 ' ' from (SELECT 药品ID as 项目ID , 药品名称 AS 项目名称, 入库数量, 0 as 库存数量, 0 as 数量 from tb_yprk where 入库日期 between :d1 and :d2' ' union all ' ' SELECT ID as 项目ID, 项目名称, 0, 库存数量, 0 from tb_yp where 项目种类=''药品项目''' ' union all ' ' SELECT 项目ID, 项目名称, 0, 0,数量 from tb_sf where 收费日期 between :d3 and :d4) as a ' ' group by 项目ID,项目名称' ; adoquery1.Parameters.ParamByName('d1').Value :=formatdatetime('yy-m-d',DateTimePicker1.Date); adoquery1.Parameters.ParamByName('d2').Value :=formatdatetime('yy-m-d',DateTimePicker2.Date); adoquery1.Parameters.ParamByName('d3').Value :=formatdatetime('yy-m-d',DateTimePicker1.Date); adoquery1.Parameters.ParamByName('d4').Value :=formatdatetime('yy-m-d',DateTimePicker2.Date); ADOQuery1.Open; end;
------
我的编程起步于ktop,我将永远支持ktop |
kgt
高階會員 發表:17 回覆:308 積分:165 註冊:2002-03-13 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |