sql - 语法 sql server
问题描述
我的 sql 语法有问题,我有 3 个这样的表
表:库存
StockCode | StockName | BeginStock
0001 | Mouse | 5
0002 | Keyboard | 1
0003 | MousePad | 4
表:购买
NoDoc | StockCode | PurchaseDate | Qty
P-0001 | 0001 | 06/12/2019 | 1
P-0002 | 0002 | 06/20/2019 | 5
P-0003 | 0002 | 06/21/2019 | 2
P-0004 | 0003 | 06/22/2019 | 1
P-0005 | 0001 | 07/01/2019 | 2
表:销售额
NoDoc | StockCode | PurchaseDate | Qty
S-0001 | 0001 | 06/30/2019 | 1
S-0002 | 0002 | 06/30/2019 | 1
S-0003 | 0002 | 06/30/2019 | 1
S-0004 | 0003 | 06/30/2019 | 1
S-0005 | 0003 | 07/01/2019 | 1
我想如果我查询日期 >= '07/01/2019' 和日期 <='07/07/2019' 库存将是
StockCode | StockName | BeginStock | Purchase | Sales | Actual
0001 | Mouse | 5 | 1 | 0 | 6
0002 | Keyboard | 6 | 0 | 0 | 6
0003 | MousePad | 4 | 0 | 1 | 3
我想知道月前和月后的beginstock,请帮助我如何在sql中查询。对不起,我是新手。谢谢你的帮助
解决方案
假设所有股票代码都存在于 Stock 表中,您可以CROSS APPLY
这样使用:
SELECT St.StockCode, St.StockName, St.BeginStock,
ISNULL(X.Purchase,0) AS Purchase, ISNULL(Y.Sales,0) AS Sales,
St.BeginStock+ISNULL(X.Purchase,0)-ISNULL(Y.Sales,0) AS Actual
FROM Stock St
CROSS APPLY (
SELECT SUM(P.Qty) AS Purchase
FROM Purchase P
WHERE P.StockCode=St.StockCode
AND P.PurchaseDate BETWEEN '20190701' AND '20190707'
) X
CROSS APPLY (
SELECT SUM(Sa.Qty) AS Sales
FROM Sales Sa
WHERE Sa.StockCode=St.StockCode
AND Sa.PurchaseDate BETWEEN '20190701' AND '20190707'
) Y
或者,您可以在派生表中使用LEFT JOIN
with ,如下所示:GROUP BY
SELECT St.StockCode, St.StockName, St.BeginStock,
ISNULL(X.Purchase,0) AS Purchase, ISNULL(Y.Sales,0) AS Sales,
St.BeginStock+ISNULL(X.Purchase,0)-ISNULL(Y.Sales,0) AS Actual
FROM Stock St
LEFT JOIN (
SELECT P.StockCode, SUM(P.Qty) AS Purchase
FROM Purchase P
WHERE P.PurchaseDate BETWEEN '20190701' AND '20190707'
GROUP BY P.StockCode
) X ON St.StockCode=X.StockCode
LEFT JOIN (
SELECT Sa.StockCode, SUM(Sa.Qty) AS Purchase
FROM Sales Sa
WHERE Sa.PurchaseDate BETWEEN '20190701' AND '20190707'
GROUP BY Sa.StockCode
) Y ON St.StockCode=Y.StockCode
推荐阅读
- node.js - 如何在 timerTrigger Azure Functions 中设置环境变量或输入?
- google-sheets - Google 表格 - 基于连续多个单元格的条件格式
- sql - SQL 触发器还是别的什么?
- git - 如何解决“open_stackdumpfile:将堆栈跟踪转储到 date.exe.stackdump”错误?
- sql-server - 使用 Powershell 导入多个 csv 文件并将其写入 MSSQL
- r - 将文本数据框转换为数字数据框会给出 NA 列表
- angular - 错误类型错误:(中间值)(中间值).init 不是函数 - Angular 6
- xml - 是元素节点的属性节点子节点
- android - ViewModel 和 LiveData 导入导致 NPE
- node.js - Restify中的路线