我以为我用SQL很熟了,但是我还得请教更多丰富经验的SQL高手!(oracle)

dgcat_6 2001-09-21 05:25:26
为什么SUM命令不起作用?
在做库存报表时,我需要查询货主每天进库、出库、退库的数量和品种。
进库、出库、退库三个表的基本结构相同,每个表都有不同货主每天进出不同货物的记录。

表字段如下:
JinKu:
HuoZhuID varchar2(2), --货主代码
JkDate date, --发生时间
GoodsID varchar2(4), --货物代码
Qty number(4), --数量
其余略


ChuKu:
HuoZhuID varchar2(2), --货主代码
CkDate date, --发生时间
GoodsID varchar2(4), --货物代码
Qty number(4), --数量
其余略


TuiKu:
HuoZhuID varchar2(2), --货主代码
TkDate date, --发生时间
GoodsID varchar2(4), --货物代码
Qty number(4), --数量
其余略

我在其上建了以下视图:目的是变成拥有所有进出记录的一张表
create or replace view vkcqry1 as
select HuoZhuID,JkData ddate,GoodSID,qty JkQty, 0 CkQty, 0 TkQty from JinKu
union
select HuoZhuID,CkData ddate,GoodSID, 0 JkQty, qty CkQty, 0 TkQty from ChuKu
union
select HuoZhuID,TkData ddate,GoodSID, 0 JkQty, 0 CkQty, qty TkQty from TuiKu;

作查询:
select count(*) from vkcqry1 where huozhuid='01' and to_char(ddate,'yyyymmdd')='20010915';
记录为:138
因为存在着重复记录。
如下:
HuoZHuid ddate goodsid kkqty ckqty tkqyt
01 20010920 0001 5 0 1
01 20010920 0001 1 3 1
02 20010920 0001 1 0 10
其余略


我需要将货主相同,并且货物相同,同一天发生的进出数量加起来。因此做如下视图:
create or replace view vkcqry as
select huozhuid,ddate,goodsid,sum(jkqty) jkqty,sum(ckqty) ckqty,sum(tkqty) tkqty
from vkcqry1 group by huozhuid,ddate,goodsid;


然后查询:
select COUNT(*) from vkcqry where huozhuid='01' and to_char(ddate,'yyyymmdd')='20010915';
记录依然为:138 好象求和没有作用!
我很困惑,我的SQL应该没有问题呀?
问题到底出在哪里了?或者要实现我的效果,SQL还可以怎样写?


...全文
119 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgcat_6 2001-09-24
  • 打赏
  • 举报
回复
mashansj:问题就出现在ddate上了。万分感谢
wilddragon 2001-09-21
  • 打赏
  • 举报
回复
期待答案
KingSunSha 2001-09-21
  • 打赏
  • 举报
回复
To xzou(缺齿小狼):
把to_char(ddate,'YYYYMMDD')改成trunc(ddate)更方便。

另外用union all,再group by,以保证在记录重复的情况下完全正确,而且union all的执行效率比union 高
wilddragon 2001-09-21
  • 打赏
  • 举报
回复
gz
wilddragon 2001-09-21
  • 打赏
  • 举报
回复
哈哈
smartdonkey 2001-09-21
  • 打赏
  • 举报
回复
完全同意xzou(缺齿小狼) 
xzou 2001-09-21
  • 打赏
  • 举报
回复
对的,date型包含时间信息的,改成
create or replace view vkcqry as
select huozhuid,to_char(ddate,'YYYYMMDD'),goodsid,sum(jkqty) jkqty,sum(ckqty) ckqty,sum(tkqty) tkqty from vkcqry1
group by huozhuid,to_char(ddate,'YYYYMMDD'),goodsid
试试
zhuzhichao 2001-09-21
  • 打赏
  • 举报
回复
你的第一個視圖中怎麼可能會出現這樣的值:
HuoZHuid ddate goodsid kkqty ckqty tkqyt
01 20010920 0001 5 0 1
01 20010920 0001 1 3 1
02 20010920 0001 1 0 10


kkqty,ckqty,tkqyt這三列只可能有1列有>0的值!
MountLion 2001-09-21
  • 打赏
  • 举报
回复
同意mashansj(风影) 
用select to_char(ddate,'hh21:mi:ss')看一下是否如此
nononono 2001-09-21
  • 打赏
  • 举报
回复
union --> union all
mashansj 2001-09-21
  • 打赏
  • 举报
回复
字段ddate为date类型,group by 时你没转换为 yyyymmdd,事实上每条记录的ddate是不同的。

2,598

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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