求一个SQL语句

weisaisz 2016-11-10 04:22:23
已有数据如下

期初数据表
ID 产品 期初数 期初入库日期
1 A 100 2016-11-1
2 B 0 2016-11-1
3 C 200 2016-11-1


入库表
ID 产品 入库日期 入库数量
1 B 2016-11-9 50
2 C 2016-11-9 100
3 D 2016-11-10 100

出库表
ID 产品 出库日期 出库数量
1 A 2016-11-9 100
2 B 2016-11-10 50
3 C 2016-11-10 250

要求结果:查询最后还有库存的产品明细,不用求数量

查询结果
产品 入库日期(最大值) 是否还有库存
A 2016-11-1 Y
C 2016-11-9 Y
D 2016-11-10 Y

谢谢






...全文
116 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-11-11
  • 打赏
  • 举报
回复
显示所有产品库存状态时 把条件去掉 e.g.
SELECT  a.产品 ,
        a.入库日期 ,
        库存 =CASE WHEN a.库存 > b.出库数量 OR b.出库数量 IS NULL THEN 'Y' ELSE 'N' END
FROM    ( SELECT    产品 ,
                    SUM(期初数) AS 库存 ,
                    MAX(入库日期) AS 入库日期
          FROM      ( SELECT    产品 ,
                                期初数 ,
                                期初入库日期 AS 入库日期
                      FROM      期初数据表
                      UNION ALL
                      SELECT    产品 ,
                                入库数量 ,
                                入库日期
                      FROM      期初数据表
                    )
          GROUP BY  产品
        ) AS a
        LEFT JOIN ( SELECT  产品 ,
                            SUM(出库数量) AS 出库数量
                    FROM    出库表
                    GROUP BY 产品
                  ) AS b ON b.产品 = a.产品
中国风 2016-11-11
  • 打赏
  • 举报
回复

--只显示有库存
SELECT  a.产品 ,
        a.入库日期 ,
        库存 = 'Y'
FROM    ( SELECT    产品 ,
                    SUM(期初数) AS 库存 ,
                    MAX(入库日期) AS 入库日期
          FROM      ( SELECT    产品 ,
                                期初数 ,
                                期初入库日期 AS 入库日期
                      FROM      期初数据表
                      UNION ALL
                      SELECT    产品 ,
                                入库数量 ,
                                入库日期
                      FROM      期初数据表
                    )
          GROUP BY  产品
        ) AS a
        LEFT JOIN ( SELECT  产品 ,
                            SUM(出库数量) AS 出库数量
                    FROM    出库表
                    GROUP BY 产品
                  ) AS b ON b.产品 = a.产品
WHERE   a.库存 > b.出库数量
        OR b.出库数量 IS NULL
weisaisz 2016-11-11
  • 打赏
  • 举报
回复
引用 4 楼 ch21st 的回复:
你的结果让人不解,对于A,入库100,出库100,怎么还会有库存

;with _init(ID,产品,期初数,期初入库日期)AS(
     SELECT  1,'A',100,'2016-11-01' UNION ALL
     SELECT  2,'B',0,'2016-11-01' UNION ALL
     SELECT  3,'C',200,'2016-11-01'
),_in(ID,产品,入库日期,入库数量)AS(
     SELECT  1,'B','2016-11-09',50 UNION ALL
     SELECT  2,'C','2016-11-09',100 UNION ALL
     SELECT  3,'D','2016-11-10',100
),_out(ID,产品,出库日期,出库数量)AS(
     SELECT  1,'A','2016-11-09',100 UNION ALL
     SELECT  2,'B','2016-11-10',50 UNION ALL
     SELECT  3,'C','2016-11-10',200
 ),_Stock AS(
     SELECT 产品,in_date,SUM(qty) AS qty 
     FROM (
         SELECT  o.产品,o.期初数 AS qty,o.期初入库日期 AS in_date FROM _init AS o UNION ALL 
         SELECT i.产品,i.入库数量 AS qty,i.入库日期 AS in_date FROM  _in AS i
     ) t GROUP BY 产品,in_date
)
SELECT *,CASE WHEN s.qty+ISNULL(ls.pre_inqty,0)>ISNULL(o.out_qty,0) THEN 'Y' ELSE 'N' end FROM _Stock AS s
OUTER APPLY(SELECT SUM(qty) AS pre_inqty FROM _Stock AS ps WHERE ps.产品=s.产品 AND ps.in_date<s.in_date) ls
OUTER APPLY (SELECT SUM(oo.出库数量) AS out_qty FROM _out AS oo WHERE oo.产品=s.产品 AND oo.出库日期>=s.in_date) o
WHERE s.qty+ISNULL(ls.pre_inqty,0)-ISNULL(o.out_qty,0)>0
ORDER BY s.产品,s.in_date
是哦,A没有,是我弄错了
道素 2016-11-11
  • 打赏
  • 举报
回复
修改下测试,数据,让C出现两行. 其实初始库存也可以认为入库,所以和入库合并按日期统计 然后根据先入先出计算剩余库存 对于某个时间点,就是之前入库加上当前入库,再和所有出库比较

;with _init(ID,产品,期初数,期初入库日期)AS(
     SELECT  1,'A',100,'2016-11-01' UNION ALL
     SELECT  2,'B',0,'2016-11-01' UNION ALL
     SELECT  3,'C',200,'2016-11-01'
),_in(ID,产品,入库日期,入库数量)AS(
     SELECT  1,'B','2016-11-09',50 UNION ALL
     SELECT  2,'C','2016-11-09',100 UNION ALL
     SELECT  3,'D','2016-11-10',100
),_out(ID,产品,出库日期,出库数量)AS(
     SELECT  1,'A','2016-11-09',100 UNION ALL
     SELECT  2,'B','2016-11-10',50 UNION ALL
     SELECT  3,'C','2016-11-10',100
 ),_Stock AS(
     SELECT 产品,in_date,SUM(qty) AS qty 
     FROM (
         SELECT  o.产品,o.期初数 AS qty,o.期初入库日期 AS in_date FROM _init AS o UNION ALL 
         SELECT i.产品,i.入库数量 AS qty,i.入库日期 AS in_date FROM  _in AS i
     ) t GROUP BY 产品,in_date
)
SELECT *,CASE WHEN s.qty+ISNULL(ls.pre_inqty,0)>ISNULL(o.out_qty,0) THEN 'Y' ELSE 'N' end FROM _Stock AS s
OUTER APPLY(SELECT SUM(qty) AS pre_inqty FROM _Stock AS ps WHERE ps.产品=s.产品 AND ps.in_date<s.in_date) ls
OUTER APPLY (SELECT SUM(oo.出库数量) AS out_qty FROM _out AS oo WHERE oo.产品=s.产品 AND oo.出库日期>=s.in_date) o
WHERE s.qty+ISNULL(ls.pre_inqty,0)-ISNULL(o.out_qty,0)>0
ORDER BY s.产品,s.in_date
/*
产品   in_date    qty         pre_inqty   out_qty     
---- ---------- ----------- ----------- ----------- ----
C    2016-11-01 200         NULL        100         Y
C    2016-11-09 100         200         100         Y
D    2016-11-10 100         NULL        NULL        Y
*/
道素 2016-11-11
  • 打赏
  • 举报
回复
你的结果让人不解,对于A,入库100,出库100,怎么还会有库存

;with _init(ID,产品,期初数,期初入库日期)AS(
     SELECT  1,'A',100,'2016-11-01' UNION ALL
     SELECT  2,'B',0,'2016-11-01' UNION ALL
     SELECT  3,'C',200,'2016-11-01'
),_in(ID,产品,入库日期,入库数量)AS(
     SELECT  1,'B','2016-11-09',50 UNION ALL
     SELECT  2,'C','2016-11-09',100 UNION ALL
     SELECT  3,'D','2016-11-10',100
),_out(ID,产品,出库日期,出库数量)AS(
     SELECT  1,'A','2016-11-09',100 UNION ALL
     SELECT  2,'B','2016-11-10',50 UNION ALL
     SELECT  3,'C','2016-11-10',200
 ),_Stock AS(
     SELECT 产品,in_date,SUM(qty) AS qty 
     FROM (
         SELECT  o.产品,o.期初数 AS qty,o.期初入库日期 AS in_date FROM _init AS o UNION ALL 
         SELECT i.产品,i.入库数量 AS qty,i.入库日期 AS in_date FROM  _in AS i
     ) t GROUP BY 产品,in_date
)
SELECT *,CASE WHEN s.qty+ISNULL(ls.pre_inqty,0)>ISNULL(o.out_qty,0) THEN 'Y' ELSE 'N' end FROM _Stock AS s
OUTER APPLY(SELECT SUM(qty) AS pre_inqty FROM _Stock AS ps WHERE ps.产品=s.产品 AND ps.in_date<s.in_date) ls
OUTER APPLY (SELECT SUM(oo.出库数量) AS out_qty FROM _out AS oo WHERE oo.产品=s.产品 AND oo.出库日期>=s.in_date) o
WHERE s.qty+ISNULL(ls.pre_inqty,0)-ISNULL(o.out_qty,0)>0
ORDER BY s.产品,s.in_date
weisaisz 2016-11-11
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:

--只显示有库存
SELECT  a.产品 ,
        a.入库日期 ,
        库存 = 'Y'
FROM    ( SELECT    产品 ,
                    SUM(期初数) AS 库存 ,
                    MAX(入库日期) AS 入库日期
          FROM      ( SELECT    产品 ,
                                期初数 ,
                                期初入库日期 AS 入库日期
                      FROM      期初数据表
                      UNION ALL
                      SELECT    产品 ,
                                入库数量 ,
                                入库日期
                      FROM      期初数据表
                    )
          GROUP BY  产品
        ) AS a
        LEFT JOIN ( SELECT  产品 ,
                            SUM(出库数量) AS 出库数量
                    FROM    出库表
                    GROUP BY 产品
                  ) AS b ON b.产品 = a.产品
WHERE   a.库存 > b.出库数量
        OR b.出库数量 IS NULL
这种算法没有看见时间的比较,有没有遵循先进先出的原则
weisaisz 2016-11-11
  • 打赏
  • 举报
回复
引用 8 楼 roy_88 的回复:
显示所有产品库存状态时 把条件去掉 e.g.
SELECT  a.产品 ,
        a.入库日期 ,
        库存 =CASE WHEN a.库存 > b.出库数量 OR b.出库数量 IS NULL THEN 'Y' ELSE 'N' END
FROM    ( SELECT    产品 ,
                    SUM(期初数) AS 库存 ,
                    MAX(入库日期) AS 入库日期
          FROM      ( SELECT    产品 ,
                                期初数 ,
                                期初入库日期 AS 入库日期
                      FROM      期初数据表
                      UNION ALL
                      SELECT    产品 ,
                                入库数量 ,
                                入库日期
                      FROM      期初数据表
                    )
          GROUP BY  产品
        ) AS a
        LEFT JOIN ( SELECT  产品 ,
                            SUM(出库数量) AS 出库数量
                    FROM    出库表
                    GROUP BY 产品
                  ) AS b ON b.产品 = a.产品
好的,谢谢。 的确用户需要所有状态的数据,已经按第一种方法先弄上去了。用户数据太多,还在检验中。先结贴
weisaisz 2016-11-10
  • 打赏
  • 举报
回复
算法就是先进先出,先扣减前面入库的或者初始库存
weisaisz 2016-11-10
  • 打赏
  • 举报
回复
结果栏位的 入库日期(最大值) 的最大值容易引起误解,就不用最大值了 直接【入库日期】好了
weisaisz 2016-11-10
  • 打赏
  • 举报
回复
如果C出库没有出完期初数, 如下 出库表 ID 产品 出库日期 出库数量 1 A 2016-11-9 100 2 B 2016-11-10 50 3 C 2016-11-10 50 则两个日期都需要出来,即C需要分两行 最后结果 查询结果 产品 入库日期(最大值) 是否还有库存 A 2016-11-1 Y C 2016-11-1 Y C 2016-11-9 Y D 2016-11-10 Y

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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