Sql server 用于存量计算的“求和”列

Sql server 用于存量计算的“求和”列,sql-server,Sql Server,我正在用sql计算库存。我有三个表产品,采购和销售。 产品表是 +----+------------------+ | id | product_name | +----+------------------+ | 1 | apple | |----|------------------| | 2 |banana | |----|------------------| | 3 |mango | +----+

我正在用sql计算库存。我有三个表产品,采购和销售。 产品表是

+----+------------------+
| id | product_name     | 
+----+------------------+
| 1  | apple            | 
|----|------------------|
| 2  |banana            | 
|----|------------------|
| 3  |mango             | 
+----+------------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   15        |dark
+-------+-------------+
|   1   |   10        |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   25        |light
+-------+-------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   5         |dark
+-------+-------------+
|   1   |   5         |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   5         |light
+-------+-------------+
现在颜色表

+----+------------------+
| id |   color_name     | 
+----+------------------+
| 1  |   dark           | 
|----|------------------|
| 2  |   light          | 
+----|------------------+
购买表是

+----+------------------+
| id | product_name     | 
+----+------------------+
| 1  | apple            | 
|----|------------------|
| 2  |banana            | 
|----|------------------|
| 3  |mango             | 
+----+------------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   15        |dark
+-------+-------------+
|   1   |   10        |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   25        |light
+-------+-------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   5         |dark
+-------+-------------+
|   1   |   5         |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   5         |light
+-------+-------------+
销售表是

+----+------------------+
| id | product_name     | 
+----+------------------+
| 1  | apple            | 
|----|------------------|
| 2  |banana            | 
|----|------------------|
| 3  |mango             | 
+----+------------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   15        |dark
+-------+-------------+
|   1   |   10        |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   25        |light
+-------+-------------+
+-------+-------------+
| id    | quantity    |color
+-------+-------------+
|   1   |   5         |dark
+-------+-------------+
|   1   |   5         |light
+-------+-------------+
|   2   |   5         |dark
+-------+-------------+
|   3   |   5         |light
+-------+-------------+
采购和销售表的外键id引用了产品表的id。现在,我正在尝试计算可用库存,即根据颜色以以下格式计算的购销差异

+----+------------------+-------------+
| id | product_name     | quantity    |color
+----+------------------+-------------+
| 1  | apple            |    10       |dark
|----|------------------|-------------|
| 1  | apple            |    5        |light
|----|------------------|-------------|
| 2  |banana            |    0        |dark
|----|------------------|-------------|
| 3  |mango             |    20       |light
+----+------------------+-------------+ 

(我没有测试任何东西)

你可能在找这个

SELECT p.id,p.Name,Purchase.purchaseQty-sales.salseQty as totalQty
FROM Product p
OUTER APPLY(
         SELECT  purchase.id, SUM(purchase.quantity) purchaseQty
         FROM purchase 
         where purchase.id= p.id
         GROUP BY purchase.id
)Purchase
OUTER APPLY(
         SELECT  sales.id, SUM(sales.quantity) salseQty
         FROM sales
         where sales.id= p.id
         GROUP BY sales.id
)sales

使用外部应用程序尝试此解决方案

drop table if exists dbo.tProduct;
drop table if exists dbo.tPurchase;
drop table if exists dbo.tSale;

create table dbo.tProduct (
    id int
    , product_name varchar(100)
);

create table dbo.tPurchase (
    id int
    , quantity int
);

create table dbo.tSale (
    id int
    , quantity int
);

insert into dbo.tProduct (id, product_name)
values (1, 'apple'), (2, 'banana'), (3, 'mango');

insert into dbo.tPurchase (id, quantity)
values (1, 15), (2, 10), (1, 5), (3, 25);

insert into dbo.tSale (id, quantity)
values (1, 5), (3, 10), (1, 5), (3, 5), (2, 5);

select
    p.id
    , p.product_name
    , pur.Quantity - sal.Quantity as Quantity
from dbo.tProduct p
    outer apply (
        select
            sum(tp.quantity) as Quantity
        from dbo.tPurchase tp
        where p.id = tp.id
    ) pur
    outer apply (
        select
            sum(tp.quantity) as Quantity
        from dbo.tSale tp
        where p.id = tp.id
    ) sal

如果没有特定产品的销售记录怎么办?如果不提供如何解决它,它将是空的这里有一个SQL方法,但是我不记得了(它用0替换空)明白了:选择ISNULL(c.quantity,0)。语法取决于您正在使用的数据库类型。您确定您的查询不会成倍增加购买和销售记录吗?不会,因为分组是BY的。如果我们有另一个表颜色,什么是根据颜色计算库存的最佳查询?如红色苹果和浅红色苹果的可用数量。我已经更改了你能帮我查一下吗?我改变了我的问题,你能帮我查一下吗