请教各位朋友一sql语句

kakon0602 2008-05-19 10:11:46
请教一sql语句,需求如下:

库存表(t_kc) 测试数据:
productId(产品编号) num(库存数量) sdate(日期)
a01 2000 2008-05-01
a02 1000 2008-05-02
a03 500 2008-05-02
a04 2000 2008-05-03

现在需要生成一个视图,数据如下显示
productId(产品编号) num(库存数量) sdate(日期)
a01 2000 2008-05-01
----------------------------------------------------
a01 2000 2008-05-02
a02 1000 2008-05-02
a03 500 2008-05-02
----------------------------------------------------
a01 2000 2008-05-03
a02 1000 2008-05-03
a03 500 2008-05-03
a04 2000 2008-05-03
上面的视图相当于查看指定日期之前的所有产品的库存日报,不使用函数与存储过程

注:上面的"-----"不需要生成,在此只是区分数据用的,
...全文
113 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehuman 2008-05-20
  • 打赏
  • 举报
回复
学习。。
xudaqing2008 2008-05-20
  • 打赏
  • 举报
回复
呵呵,昨天理解错了,不好意思!
5楼回答得很好,向他学习!
simonn88 2008-05-20
  • 打赏
  • 举报
回复
ding hebo
hebo2005 2008-05-19
  • 打赏
  • 举报
回复
sysdate-16就相当于输入2008-05-03
[Quote=引用 7 楼 kakon0602 的回复:]
另外,如果我测试数据里有
'a05', 500, '2008-01-01'
那应该如何实现呢?
[/Quote]
也就是你想从1月1日开始显示?
如果这样的话,你要改成这样,我这设了两个变量start_day,end_day,你调用的时候可以用具体日期替换,
这样就会生成两个日期间每天的数据

SELECT a.productid, a.num, b.sdate
FROM a,
(SELECT TO_CHAR (:start_day + ROWNUM - 1, 'YYYY-MM-DD') sdate
FROM DUAL
CONNECT BY ROWNUM <= ABS(:end_day - :start_day) + 1) b
WHERE a.sdate <= b.sdate

kakon0602 2008-05-19
  • 打赏
  • 举报
回复
另外,如果我测试数据里有
'a05', 500, '2008-01-01'
那应该如何实现呢?
kakon0602 2008-05-19
  • 打赏
  • 举报
回复
是的,我生成这样的视图之后,在查询时传个日期进去,但有点不明白,sysdate 为什么要减16呢。
hebo2005 2008-05-19
  • 打赏
  • 举报
回复
WITH a AS
(SELECT 'a01' productid, 2000 num, '2008-05-01' sdate
FROM DUAL
UNION ALL
SELECT 'a02', 1000, '2008-05-02'
FROM DUAL
UNION ALL
SELECT 'a03', 500, '2008-05-02'
FROM DUAL
UNION ALL
SELECT 'a04', 2000, '2008-05-03'
FROM DUAL)


SELECT a.productid, a.num, b.sdate
FROM a,
(SELECT TO_CHAR (TRUNC (SYSDATE, 'MM') + ROWNUM - 1,
'YYYY-MM-DD'
) sdate
FROM DUAL
CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (SYSDATE, 'dd'))) b
WHERE a.sdate <= b.sdate


结果
Row# PRODUCTID NUM SDATE

1 a01 2000 2008-05-01
2 a01 2000 2008-05-02
3 a02 1000 2008-05-02
4 a03 500 2008-05-02
5 a01 2000 2008-05-03
6 a02 1000 2008-05-03
7 a03 500 2008-05-03
8 a04 2000 2008-05-03
9 a01 2000 2008-05-04
10 a02 1000 2008-05-04
11 a03 500 2008-05-04
12 a04 2000 2008-05-04
13 a01 2000 2008-05-05
14 a02 1000 2008-05-05
15 a03 500 2008-05-05
16 a04 2000 2008-05-05
17 a01 2000 2008-05-06
18 a02 1000 2008-05-06
19 a03 500 2008-05-06
20 a04 2000 2008-05-06
21 a01 2000 2008-05-07
22 a02 1000 2008-05-07
23 a03 500 2008-05-07
24 a04 2000 2008-05-07
25 a01 2000 2008-05-08
26 a02 1000 2008-05-08
27 a03 500 2008-05-08
28 a04 2000 2008-05-08
29 a01 2000 2008-05-09
30 a02 1000 2008-05-09
31 a03 500 2008-05-09
32 a04 2000 2008-05-09
33 a01 2000 2008-05-10
34 a02 1000 2008-05-10
35 a03 500 2008-05-10
36 a04 2000 2008-05-10
37 a01 2000 2008-05-11
38 a02 1000 2008-05-11
39 a03 500 2008-05-11
40 a04 2000 2008-05-11
41 a01 2000 2008-05-12
42 a02 1000 2008-05-12
43 a03 500 2008-05-12
44 a04 2000 2008-05-12
45 a01 2000 2008-05-13
46 a02 1000 2008-05-13
47 a03 500 2008-05-13
48 a04 2000 2008-05-13
49 a01 2000 2008-05-14
50 a02 1000 2008-05-14
51 a03 500 2008-05-14
52 a04 2000 2008-05-14
53 a01 2000 2008-05-15
54 a02 1000 2008-05-15
55 a03 500 2008-05-15
56 a04 2000 2008-05-15
57 a01 2000 2008-05-16
58 a02 1000 2008-05-16
59 a03 500 2008-05-16
60 a04 2000 2008-05-16
61 a01 2000 2008-05-17
62 a02 1000 2008-05-17
63 a03 500 2008-05-17
64 a04 2000 2008-05-17
65 a01 2000 2008-05-18
66 a02 1000 2008-05-18
67 a03 500 2008-05-18
68 a04 2000 2008-05-18
69 a01 2000 2008-05-19
70 a02 1000 2008-05-19
71 a03 500 2008-05-19
72 a04 2000 2008-05-19

这是取当月的每天库存的,把sysdate换成sysdate-16(5月3日),结果
Row# PRODUCTID NUM SDATE

1 a01 2000 2008-05-01
2 a01 2000 2008-05-02
3 a02 1000 2008-05-02
4 a03 500 2008-05-02
5 a01 2000 2008-05-03
6 a02 1000 2008-05-03
7 a03 500 2008-05-03
8 a04 2000 2008-05-03

其实你的题目里少了个限制,输入日这前,还是要有个范围的,要有起始日,截止日
,另外,你这张表应该应该还有出库的数量吧,否则会把历史纪录全部显示的
kakon0602 2008-05-19
  • 打赏
  • 举报
回复
不是这样的,请朋友们仔细看一下我需要生成的视图的数据格式。
xudaqing2008 2008-05-19
  • 打赏
  • 举报
回复
日期‘20080502’可以调试,比如to_char(sysdate,'yyyymmdd')
xudaqing2008 2008-05-19
  • 打赏
  • 举报
回复
create view v_kc as
select *
from t_kc
where to_char(sdate,'yyyymmdd') <= '20080502'
hebo2005 2008-05-19
  • 打赏
  • 举报
回复
你的意思就是分组显示每天的库存吧,每天显示,sdate<=当天的数量
我去写段语句测试下

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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