来求助:想把下面的子查询改为连接方式写法
/*CREATE TABLE 库存(货号 INT, 数量 INT, 入库日期 INT, 出库日期 INT)
INSERT 库存
select '1', '1', '20130701', ' 20130710' union all
select '1', '2', '20130702', ' 20130704' union all
select '1', '3', '20130703', ' 20130708' union all
select '1', '4', '20130705', ' 20130706' union all
select '2', '1', '20130701', ' 20130703' union all
select '2', '2', '20130702', ' 20130705' union all
select '2', '3', '20130703', ' 20130704'
SELECT * FROM 库存
--数据表格*/
SELECT 货号,MAX(数量) 历史最大库存
FROM(
select 货号 ,入库日期, 数量=(select sum(c.数量)
from 库存 c
where c.入库日期<=m.入库日期 and c.出库日期>=m.入库日期 and c.货号=m.货号
)
from 库存 m) T
GROUP BY 货号
先谢过各位大大了!SQLselect
/*CREATE TABLE 库存(货号 INT, 数量 INT, 入库日期 INT, 出库日期 INT)
INSERT 库存
select '1', '1', '20130701', ' 20130710' union all
select '1', '2', '20130702', ' 20130704' union all
select '1', '3', '20130703', ' 20130708' union all
select '1', '4', '20130705', ' 20130706' union all
select '2', '1', '20130701', ' 20130703' union all
select '2', '2', '20130702', ' 20130705' union all
select '2', '3', '20130703', ' 20130704'
SELECT * FROM 库存
--数据表格*/
SELECT 货号,MAX(数量) 历史最大库存
FROM(
select 货号 ,入库日期, 数量=(select sum(c.数量)
from 库存 c
where c.入库日期<=m.入库日期 and c.出库日期>=m.入库日期 and c.货号=m.货号
)
from 库存 m) T
GROUP BY 货号
先谢过各位大大了!SQLselect
解决方案 »
- 数据库设计中的14个技巧
- 查询语句变量问题
- 我设计的表a(id,number) 其中id是主键,number是int型 我想当我输入的数据中,如果出现id相同的,用什么样的sql语言才能把number的数累加,而不用添加相同id的记录了。
- SQL语句: where tname='aa' or tname='bb' 和 where tname in ('aa','bb') 哪个效率高?
- 求助:急救,我下面这种情况 存储过程要怎么写?谢谢!
- 语句和字符串类型的变量如何结合在一起使用??
- 比价网商家数量匹配
- SQL2005replciation中publisher端表加一字段,在publication的article中会自动加上该新字段并打上钩,如何避免?另一贴100分一起结。
- 注册时,出现提示: “SQL Server 不存在或访问被拒绝”!!!
- 考考你的SQL?我是做不出来。
- 网狐棋牌,ConnectionWrite (send()).一般性网络错误,请检查网络文档
- 帮忙看下这么简单的语句会出错呢
/*
CREATE TABLE 库存(货号 INT, 数量 INT, 入库日期 INT, 出库日期 INT)
INSERT 库存
select '1', '1', '20130701', ' 20130710' union all
select '1', '2', '20130702', ' 20130704' union all
select '1', '3', '20130703', ' 20130708' union all
select '1', '4', '20130705', ' 20130706' union all
select '2', '1', '20130701', ' 20130703' union all
select '2', '2', '20130702', ' 20130705' union all
select '2', '3', '20130703', ' 20130704'
SELECT * FROM 库存
--数据表格
*/select 货号,max(数量) as 数量
from
(
select 货号,数量=isnull((select sum(数量) from 库存 a where t.货号=a.货号 and a.入库日期<=t.入库日期),0)
-isnull((select sum(数量) from 库存 b where t.货号=b.货号 and b.出库日期<=t.入库日期),0)
from 库存 t
)tb
group by 货号/*
货号 数量
1 8
2 5
*/
select 货号,max(t.数量) '历史最大库存'
from 库存 m
cross apply
(select sum(c.数量) '数量' from 库存 c
where c.入库日期<=m.入库日期 and c.出库日期>=m.入库日期 and c.货号=m.货号) t
group by 货号
(
SELECT
a.货号,
a.入库日期,
数量=SUM(b.数量)
FROM 库存 a
INNER JOIN 库存 b
ON a.货号 = b.货号
AND b.入库日期 <= a.入库日期
AND b.出库日期 >= a.入库日期
GROUP BY a.货号, a.入库日期
) T
GROUP BY 货号
/*
货号 历史最大库存
1 8
2 6
*/
十分感谢您!本小小新对于CROSS APPLY并不是很熟悉,能不能简单的介绍一下给我呢?十分感谢!
十分感谢!您依旧是那么厉害!
细心的您应该能发现其实这个问题就是上一道您回答解决的问题的另一种方法:就是比较绕人,很难想到。
期待您对上一个作答的注解,小小新对CROSS APPLY不熟悉,在空间也给您留言,期待您的教导。
#1.扫描表A中的第一行记录
#2.取第一行记录中的a.id值,传给函数N,执行select * from tableB b where b.id = a.id,假如返回Y条记录(y>=0)
#3.它们JOIN起来产生一个1乘Y=Y行记录的结果集.
重复以上3个步骤,直至取出所有结果集并UNION ALL起来。select * from
(select * from tableA) a --表A(假设表A有5行记录)
cross apply --只能传APPLY这行上面的表中的字段
(select * from tableB b where b.id = a.id) b --函数N需要说明的是CROSS APPLY 和 OUTER APPLY的区别:如果步骤#3返回了0行记录,那么用OUTER APPLY就相当于LEFT JOIN(即1乘0=1),如果用CROSS APPLY相当于INNER JOIN(即1乘0=0)
http://blog.csdn.net/xrongzhen/article/details/6271370