首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL 改写

2013-08-10 
SQL 改写求助来求助:想把下面的子查询改为连接方式写法/*CREATE TABLE 库存(货号 INT, 数量 INT, 入库日期

SQL 改写求助
来求助:想把下面的子查询改为连接方式写法


/*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 货号

先谢过各位大大了! SQL select
[解决办法]

/*
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 货号



/*
货号 数量
18
25
*/


[解决办法]

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 货号,历史最大库存=MAX(数量) FROM
(
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 货号
/*
货号历史最大库存
18
26
*/

[解决办法]
APPLY是2005的新语法。这么理解:APPLY的使用相当于一个函数,这个函数可传参,也可不传参。如果传参的话,只能传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)
[解决办法]
cross apply主要用于表值函数,这样就比较好理解,推荐你看下这篇文章
http://blog.csdn.net/xrongzhen/article/details/6271370

热点排行