【问题标题】:Sql Server : Select query with calculation on rows one after anotherSql Server:选择查询并逐行计算
【发布时间】:2015-09-23 14:29:37
【问题描述】:

表格 PURCHASE(PDate, ItemName, PQty, Rate)

PDate       | ItemName     | PQty  | Rate
============================================
01-04-2015  | Mobile Phone | 06    | 05,000
01-04-2015  | Laptop       | 07    | 30,000
03-04-2015  | Mobile Phone | 03    | 06,000
04-04-2015  | Mobile Phone | 08    | 07,000
04-04-2015  | Laptop       | 03    | 40,000
05-04-2015  | Mobile Phone | 05    | 04,000

表格 SALES(SDate, ItemName, SQty)

SDate       | ItemName     | SQty
=================================
02-04-2015  | Mobile Phone | 02
03-04-2015  | Laptop       | 03
03-04-2015  | Mobile Phone | 05
04-04-2015  | Mobile Phone | 07
04-04-2015  | Laptop       | 03
06-04-2015  | Laptop       | 02

SQL

  • 这里我们需要在售后查看采购表中的剩余商品及其库存价值(PQty*Rate)。 (收盘
  • 选择查询应在此处执行该过程。
  • PURCHASE表的PQty应该一个一个从上到下根据SALES按PDate的升序扣除表格的 SQty 一个接一个从上到下按日期升序排列。
  • PURCHASE Table 的 PQty 不应变为 0(零),这是当然的。
  • 如果 PQty 达到零,则从列表中 PURCHASE Table's PQty 的下一行中扣除 SALES 的剩余 SQty。
  • 如果没有更多行可用,最后一行可能为负值。
  • 表之间的条件已完成WHERE SALES.ItemName LIKE PURCHASE.ItemName

表格 EXPECTED SELECT QUERY RESULT (Date, ItemName, Qty, Rate, ProductValue)

PDate       | ItemName     | PQty  | Rate   | ProductValue
===========================================================
01-04-2015  | Mobile Phone | 00    | 05,000 |      0.00
01-04-2015  | Laptop       | 00    | 30,000 |      0.00
03-04-2015  | Mobile Phone | 00    | 06,000 |      0.00
04-04-2015  | Mobile Phone | 03    | 07,000 | 21,000.00
04-04-2015  | Laptop       | 02    | 40,000 | 80,000.00
05-04-2015  | Mobile Phone | 05    | 04,000 | 20,000.00

我该如何解决这个问题?

【问题讨论】:

  • 能否提供可消费格式的ddl和样本数据? sqlfiddle.com 将是一个不错的起点。另外,定义“从上到下”。顺序是什么?您提供的数据中似乎没有任何内容来获取发布的行顺序。这听起来可能是一个运行中的总问题,因此 sql server 的版本也很重要,因为在 sql 2012 之前和之后执行此操作的方法差异很大。
  • 从上到下是日期的 ASC 顺序。问题已编辑。
  • 结果表前 3 行的 Qty 和 ProductValue 中的零是什么意思?
  • 一旦购买了产品,它们就会被添加到 PURCHASE 表中。当商品售出时,它们会按日期从 PURCHASE 表中扣除。 PURCHASE 的前三行为零,因为这些商品已售出。
  • @shibormot,如果您在销售表中看到 - 已售出 14 部手机和 8 部笔记本电脑。因此,前 2 排手机(6+3)和第 4 排的 5 部手机已售出。共售出 8 台笔记本电脑,排在第 2 排,即笔记本电脑 0 数量和第 5 排 2。

标签: sql sql-server select inner-join inventory-management


【解决方案1】:
SELECT PDate, ItemName, MPQty, PQty, ISNULL(SQty,0) AS SQty,
ISNULL((CASE WHEN SQTY>=PQty THEN 0 WHEN (SQty+MPQty)>PQty THEN PQty-SQty ELSE MPQty END),0) AS Qty, Rate,
(ISNULL((CASE WHEN SQTY>=PQty THEN 0 WHEN (SQty+MPQty)>PQty THEN PQty-SQty ELSE MPQty END),0)*Rate) AS PValue FROM
(SELECT P.PDate AS PDate, P.ItemName AS ItemName, P.PQty AS MPQty,
(SELECT SUM(P1.PQty) FROM PURCHASE P1 WHERE P1.ItemName=P.ItemName AND P1.PDate<=P.PDate) AS PQty,
(SELECT SUM(S1.SQty) FROM SALES S1 WHERE S1.ItemName=P.ItemName) AS SQty,    
P.Rate AS Rate FROM PURCHASE P)X ORDER BY Pdate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多