全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1367
推到 Plurk!
推到 Facebook!

如何从三张表中查询出数据显示在一起

答題得分者是:timhuang
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-13 18:17:13 IP:222.184.xxx.xxx 未訂閱
数据库为ACCESS
 
有表1(库存表) 字段 项目ID 项目名称 库存数量 
 表2(销售表)  字段 项目ID 项目名称 销售数量 
 表3(进库表)  字段 项目ID 项目名称 进库数量 
注: 项目ID为唯一索引,三表中只要项目ID相同,那么肯定为同一项目。
     销售数量和进库数量是要合计的,把项目ID相同的数量要合计在一起
     库存数量不要合计,一个项目只会有一条库存数量记录
用何种查询语法,实现如下功能(项目进销存一览表)
字段 项目ID 项目名称 进库数量 库存数量 销售数量    
------
我的编程起步于ktop,我将永远支持ktop
kgt
高階會員


發表:17
回覆:308
積分:165
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-13 19:56:16 IP:61.219.xxx.xxx 未訂閱
字段-->what mean?
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-13 20:01:51 IP:222.184.xxx.xxx 未訂閱
引言: 字段-->what mean?
数据表中的栏位
------
我的编程起步于ktop,我将永远支持ktop
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-13 22:43:57 IP:203.95.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-14 07:29:55 IP:222.184.xxx.xxx 未訂閱
 
我参照前辈的指教,根据自己的软件的实际情况,编写代码如下:
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-14 11:52:52 IP:220.132.xxx.xxx 未訂閱
所謂只有第一行有被執行的意思是... 應該不會有這種狀況才對啊. 建議你在 open 前先 ShowMessage 出來, 如, ShowMessage(ADOQuery1.SQL.Text); 或是先存檔起來, ADOQuery1.SQL.SaveToFile('c:\query.txt'); 然後確認無誤後再將該指令直接放到 access 中執行看看, 以確認問題所在.
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-14 12:22:31 IP:222.184.xxx.xxx 未訂閱
经过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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-14 14:35:31 IP:222.184.xxx.xxx 未訂閱
又改了一下,改成了0 as 数量就没那个错误了 基本成功了,我再试一下,如何加时间条件 發表人 - ntjrr 於 2005/11/14 16:13:18
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-14 18:21:18 IP:222.184.xxx.xxx 未訂閱
代码运行成功了,麻烦前辈看一下,我自己的代码有无不妥之处,或者说有无可以进一步优化的地方,谢谢! 
 
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-14 19:38:15 IP:61.219.xxx.xxx 未訂閱
基本上無太大的問題, 若是使用ORACLE,則需注意數字的NULL處理。 SUM( NVL(銷售數量,0) )
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-14 23:08:32 IP:220.132.xxx.xxx 未訂閱
看來你大約搞懂了這個查詢指令了吧. 其實只是一個 union all 的聯合查詢, 再用一個外包的查詢進行 group by 而已, 將原來的 union all 的結果當子查詢用, 至於 as a 的這個部分是指將 union all 的子查詢, 給個 alias name 叫做 a , 至於要叫什麼都行, 只是要給定一個 alias name 而已.
系統時間:2024-06-28 7:50:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!