来求助:想把下面的子查询改为连接方式写法
/*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

解决方案 »

  1.   


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

  2.   


    select 货号,max(t.数量) '历史最大库存'
    from 库存 m
    cross apply
    (select sum(c.数量) '数量' from 库存 c 
     where c.入库日期<=m.入库日期 and c.出库日期>=m.入库日期 and c.货号=m.货号) t
    group by 货号
      

  3.   

    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 货号
    /*
    货号 历史最大库存
    1 8
    2 6
    */
      

  4.   


    十分感谢您!本小小新对于CROSS APPLY并不是很熟悉,能不能简单的介绍一下给我呢?十分感谢!
      

  5.   


    十分感谢!您依旧是那么厉害!
    细心的您应该能发现其实这个问题就是上一道您回答解决的问题的另一种方法:就是比较绕人,很难想到。
    期待您对上一个作答的注解,小小新对CROSS APPLY不熟悉,在空间也给您留言,期待您的教导。
      

  6.   

    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)
      

  7.   

    cross apply主要用于表值函数,这样就比较好理解,推荐你看下这篇文章
    http://blog.csdn.net/xrongzhen/article/details/6271370