数据库继篇--------!一个比上两篇要复杂一点点的问题,进来吧,兄弟们!!!to 弱水三千,TR@SOE,程序猪,书生,叶老大,过江项羽............及各位高手们及爱好者们!!!!!!!!!!!!!!!!!!!!

明行 2001-08-26 06:36:04
加精
两个表:
table1.dbf:
num name
1 aa
2 bb
3 cc
4 dd

table2.dbf
num date 新购 float2 float3 float4 库存
1 01-07-02 25 2 0 2 0
2 ....
3 ...
4 ...
1 01-08-03 ...
2 ....
3 ....
.
.
.
.
.
.
.

要对表二中 num相同的两条记录,这两个记录被找出来是条件是一个用系统日期中的月与表中一个记录中的月相同,另一个记录是上个记录的上个月.
也就是说要用7月的库存与8月的新购相加得出的结果去与float2+float3+float4比较是不是相等的。

最后输出:
select table1.num table1.name
注:表一中的num是维一的。


请各位帮助,因将参与分转为了可用分,所以只能加21分请谅解,如果要分,我可以再加...............
多谢各位了!!!!!!!!!!!!!!!!!!
...全文
135 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
明行 2001-08-29
  • 打赏
  • 举报
回复
各位老大都是高手,对我的关照犹如长江滔滔不绝......
多谢各位的大力支持,对BCB充满了希望,。。。。。
wjzhuang 2001-08-29
  • 打赏
  • 举报
回复
弱水来了,我只能学习的份了
luhongjun 2001-08-29
  • 打赏
  • 举报
回复
KingSunSha(弱水三千) 
老大已经给出解法,我们已经没有叉言的地方了。哈哈。
明行 2001-08-29
  • 打赏
  • 举报
回复
EXTRACT是一个用于分离数据库中年月日的函数,它的格式为:
EXTRACT(YEAR from 字段)
........month.........
........day...........
ROWNUM就不知道了,我没用过,不没见过ORACLE
我可能我有一段时间不能上机调试我的程序了,我要回家般机器,所以这个问题只能在以后给调试过了后再给分,请见谅!!!!!!
KingSunSha 2001-08-27
  • 打赏
  • 举报
回复
不好意思,上面的SQL段多了一个ROWNUM...FROM TABLE2,完全不需要
KingSunSha 2001-08-27
  • 打赏
  • 举报
回复
如果你一定要用本月记录和上月记录记录做比较,可以用以下的SQL段:
(假定每月只有一条记录)
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, --本月记录
(SELECT ROWNUM, NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, --上月记录
WHERE X.NUM = Y.NUM (+)--考虑到上月可能没有记录,库存为0
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM

我用来计算上月的算法是本月1号减1天,很繁复,哪位有更好的算法?
KingSunSha 2001-08-27
  • 打赏
  • 举报
回复
我才你想要查有错误的记录行吧?下面一段SQL是查相邻两次记录不符合条件的所有记录(不一定要求每个月一条记录,只要时间又先后次序就行)。
表2的结构如下:
NUM -- 产品编号
UPD_DATE -- 更新日期(不能用DATE)
INBOUND_QTY -- 入库数量
STOCK_ONHAND -- 库存数量
......

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1 A,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT ROWNUM, NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
ORDER BY NUM, UPD_DATE DESC) X, --用逆序对UPD_DATE排序
(SELECT ROWNUM, NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
ORDER BY NUM, UPD_DATE DESC) Y --用逆序对UPD_DATE排序
WHERE X.NUM = Y.NUM --两次排序的NUM相同
AND X.ROWNUM = Y.ROWNUM - 1 --第一次的行号在第二次前一位
AND X.INBOUND_QTY + Y.STOCK_ONHAND <> X.STOCK_ONHAND ) B --判断数量是否为不合法
WHERE A.NUM = B.NUM

不过我觉得你这么做表结构有点问题,我做仓库管理系统很久了。没遇上过这种要求。
TR@SOE 2001-08-27
  • 打赏
  • 举报
回复
但是,有一点要指出,你的数据结构确实是有问题。
TR@SOE 2001-08-27
  • 打赏
  • 举报
回复
弱水说了,我就不说了。他是高手。

学习。
KingSunSha 2001-08-27
  • 打赏
  • 举报
回复
我糊涂了。第二种写法不用ROWNUM,只是日期/字符转换函数要你自己变一下。
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, --本月记录
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, --上月记录
WHERE X.NUM = Y.NUM (+)--考虑到上月可能没有记录,库存为0
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM
KingSunSha 2001-08-27
  • 打赏
  • 举报
回复
我记得你用的数据库又什么EXTRACT函数,不知道是什么?孤陋寡闻了。
你能不能用ROWNUM?这是ORACLE才有的。如果没有,让我重新想一想。
明行 2001-08-27
  • 打赏
  • 举报
回复
这个结构不是我能决定的,他们把每个月的都放在一个表中,这样上月的剩余是这月的期初数,用本月期初加本月其它......
「已注销」 2001-08-26
  • 打赏
  • 举报
回复
[秋枫复制了下来 回去仔细看去了 TR@OSE伸长了脖子在后面等着 弱水三千已经轮到了……]

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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