背景:我有一个系统来跟踪已订购并运送到各个地方的库存。有一个库存表,其中包含所有库存特定的属性以及每个项目的初始订购量:
库存表
CREATE TABLE Inventory
(
InventoryID int,
InventoryName varchar,
AmtOrdered float,
Weight float,
Color string
)
然后,我有一个InventoryTransportation表,用于记录这些订购商品到达终点时的移动历史记录
库存运输表
CREATE TABLE InventoryTransportation
(
InventoryTransportationId int,
fkInventoryId int,
AmtTransported float,
FromLocation string,
ToLocation string
)
这些项目具有到达最终位置的定义位置。 (供应商->仓库,供应商->站点,仓库->站点,仓库->供应商,站点->供应商)。
我需要计算的列是“供应商数量”,“仓库数量”和“现场数量”。
当前,我只是返回所有历史数据并在我的业务层中计算这些值。但是,如果我只是在数据库方面这样做会容易得多,这样做可能比我做的要有效得多。
我现在计算的方式是:
供应商数量= AmtOrdered + Sum(AmtTransported,其中ToLocation = 供应商)-总和(AmtTransported,其中FromLocation =供应商)
仓库数量=总和(AmtTransported到ToLocation =仓库)- 总和(AmtTransported,其中FromLocation =仓库)
站点数量=总和(AmtTransported到ToLocation =站点)- 总和(AmtTransported FromFromLocation = Site)
问题 有没有一种方法可以写一个查询,使“和”作为与它们所属的清单记录相关联的列返回?
我首先进行“左连接”子查询来进行计算,但是我不知道如何使用+ if从某个位置或-if其到公式的位置部分来进行汇总,并且我不知道如何返回每个数量都来自该子查询中的多个列(或者,如果我必须使用多个子查询)。
我认为要做多列,我必须弄清楚如何使用SQL Pivot命令,但是我并没有完全了解如何使用它。
任何帮助将不胜感激
更新 当前,为此,我添加了一系列LeftJoins来分别计算每个单独的指标。它可以工作,但我不知道这是否是正确的方法。
SELECT
Ordered = ps.quantity
,[@Vendor] = ps.Quantity - COALESCE(psrToVendor.ToVendor, 0) - COALESCE(psrFromVendor.FromVendor, 0)
FROM Project.ProjectSpec ps
LEFT JOIN
(
SELECT
psrd.ProjectSpecID
,ToVendor = SUM(psrd.QuantityReceived)
FROM Project.ProjectSpecReceivedDetails psrd
WHERE
psrd.Deleted = 0
AND psrd.ToProjectSpecLocationID = 1
GROUP BY psrd.ProjectSpecID
) psrToVendor ON psrToVendor.ProjectSpecID = ps.ID
LEFT JOIN
(
SELECT
psrd.ProjectSpecID
,FromVendor = SUM(psrd.QuantityReceived)
FROM Project.ProjectSpecReceivedDetails psrd
WHERE
psrd.Deleted = 0
AND psrd.FromProjectSpecLocationID = 1
GROUP BY psrd.ProjectSpecID
) psrFromVendor ON psrFromVendor.ProjectSpecID = ps.ID