Sql 服务器:Select 逐行计算查询
Sql Server : Select query with calculation on rows one after another
Table 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
Table 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
- 这里我们需要查看 PURCHASE Table 售后的剩余商品及其库存价值 (PQty*Rate)。 (收盘价)
- select 查询应该在此处执行此过程。
- PURCHASEtable的PQty应该扣除一个一个,从上到下 根据 SALES table's SQty 一个一个, 从上到下 按日期升序排列。
- PURCHASE Table 的 PQty 不应变为 0(零),这是当然的。
- Incase,如果 PQty 达到零,从 PURCHASE Table's[= 的下一行中扣除 SALES 剩余的 SQty 52=] 列表中的 PQty。
- 如果没有更多行可用,最后一行可能为负值。
- tables 之间的条件完成 WHERE SALES.ItemName LIKE PURCHASE.ItemName
Table 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
我该如何解决这个问题?
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
Table 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
Table 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
- 这里我们需要查看 PURCHASE Table 售后的剩余商品及其库存价值 (PQty*Rate)。 (收盘价)
- select 查询应该在此处执行此过程。
- PURCHASEtable的PQty应该扣除一个一个,从上到下 根据 SALES table's SQty 一个一个, 从上到下 按日期升序排列。
- PURCHASE Table 的 PQty 不应变为 0(零),这是当然的。
- Incase,如果 PQty 达到零,从 PURCHASE Table's[= 的下一行中扣除 SALES 剩余的 SQty 52=] 列表中的 PQty。
- 如果没有更多行可用,最后一行可能为负值。
- tables 之间的条件完成 WHERE SALES.ItemName LIKE PURCHASE.ItemName
Table 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
我该如何解决这个问题?
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