SQL聚合查询,其中联接表中的数据可能有记录也可能没有记录

时间:2018-11-21 14:50:11

标签: sql azure-sql-database

背景:我有一个系统来跟踪已订购并运送到各个地方的库存。有一个库存表,其中包含所有库存特定的属性以及每个项目的初始订购量:

库存表

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

0 个答案:

没有答案