我正在尝试使用 VB.NET 中的 MS Access 数据库创建 SQL 项目历史库存卡。我有下面的 SQL,但它还不正确:
SELECT CodeProduct, Sum(IIf(Cat="IN", Qty, 0)) AS [IN], Sum(IIf(Cat="Out", Qty, 0)) AS OUT, Sum(Qty * IIf(Cat="OUT", -1, 1)) AS BALANCE
FROM (
SELECT [No], Invono, CodeProduct,Qty, "IN" AS Cat FROM PurchaseDetail
UNION
SELECT [No], Invono, CodeProduct, Qty, "OUT" FROM SalesDetail
) AS DetailUNION
WHERE CodeProduct = 'A'
GROUP BY CodeProduct;
上述 SQL 代码的结果
代码产品 | 在 | 出 | 平衡 |
---|---|---|---|
A | 75 | 65 | 10 |
样本数据:
桌子
Purchase
因沃诺 | 参与 | 交易 | 备注 | 姓名SC |
---|---|---|---|---|
1000 | 23 年 10 月 18 日 | 购买 | 再次重复 | 测试1 |
1001 | 23 年 10 月 19 日 | 购买 | 测试2 |
桌子
PurchaseDetail
因沃诺 | 没有 | 代码产品 | 数量 | 信息 |
---|---|---|---|---|
1000 | 1 | A | 50 | 白色 |
1000 | 2 | B | 35 | |
1001 | 1 | C | 17 | |
1001 | 2 | A | 25 | 棕色 |
桌子
Sales
因沃诺 | 参与 | 交易 | 备注 | 姓名SC |
---|---|---|---|---|
1000 | 23 年 10 月 18 日 | 销售 | 测试10 | |
1000 | 23 年 10 月 19 日 | 销售 | 测试20 | |
1000 | 23 年 10 月 20 日 | 销售 | 测试30 |
桌子
SalesDetail
因沃诺 | 没有 | 代码产品 | 数量 | 信息 |
---|---|---|---|---|
1000 | 1 | A | 25 | 白色 |
1001 | 1 | C | 35 | |
1001 | 2 | A | 15 | 白色 |
1002 | 1 | A | 25 | 棕色 |
想要的结果
因沃诺 | 参与 | 交易 | 没有 | 代码产品 | 数量 | 信息 | 备注 | 姓名SC | 在 | 出 | 平衡 |
---|---|---|---|---|---|---|---|---|---|---|---|
1000 | 23 年 10 月 18 日 | 购买 | 1 | A | 50 | 白色 | 再次重复 | 测试1 | 50 | 50 | |
1000 | 23 年 10 月 18 日 | 销售 | 1 | A | 25 | 白色 | 测试10 | 25 | 25 | ||
1000 | 23 年 10 月 19 日 | 购买 | 2 | A | 25 | 棕色 | 测试2 | 25 | 50 | ||
1000 | 23 年 10 月 19 日 | 销售 | 2 | A | 15 | 白色 | 测试20 | 15 | 35 | ||
1000 | 23 年 10 月 20 日 | 销售 | 1 | A | 25 | 棕色 | 测试30 | 25 | 10 | ||
... |
使用 INNER JOIN 将销售和采购表包含在 UNION 行中:
SELECT InvoDate, Cat, InvoNo, CodeProduct, NameSC, Sum(IIf(Cat="IN", Qty, 0)) AS [IN], Sum(IIf(Cat="Out", Qty, 0)) AS OUT, Sum(Qty * IIf(Cat="OUT", -1, 1)) AS BALANCE
FROM (
SELECT [No], InvoDate, Purchase.Invono, CodeProduct, Qty, NameSC, "IN" AS Cat FROM PurchaseDetail INNER JOIN Purchase ON Purchase.Invono = PurchaseDetail.Invono
UNION
SELECT [No], InvoDate, Sales.Invono, CodeProduct, Qty, NameSC, "OUT" FROM SalesDetail INNER JOIN Sales ON Sales.Invono = SalesDetail.Invono
) AS DetailUNION
WHERE CodeProduct = 'A'
GROUP BY InvoDate, Cat, InvoNo, CodeProduct, NameSC;
InvoDate | 猫 | InvoNo | 代码产品 | 姓名SC | 在 | 出 | 平衡 |
---|---|---|---|---|---|---|---|
2023年10月18日 | 在 | 1000 | A | 测试1 | 50 | 0 | 50 |
2023年10月18日 | 出 | 1000 | A | 测试10 | 0 | 25 | -25 |
2023年10月19日 | 在 | 1001 | A | 测试2 | 25 | 0 | 25 |
2023年10月19日 | 出 | 1000 | A | 测试20 | 0 | 25 | -25 |
2023年10月20日 | 出 | 1000 | A | 测试30 | 0 | 25 | -25 |