查询以获取期间的总采购量和期末库存

Query to get Total Purchases and Closing Stock for Period

我当前的设置:

产品Table

购买量Table

收盘价

我想创建一个查询,列出每个月末的所有 PNAME 产品、总采购量和结束数量。次月末,上月收盘价为当月开盘价。

采购发生在整个月,我们在每个月的最后一天获取期末库存。我尝试使用查询向导并从产品中导入 PNAME,从采购中导入 Quantity,从期末库存中导入 Quantity,但我只得到采购总额和期末库存总额是空白的。

首先提个小建议:

您的问题非常广泛,因为您已经陈述了您 想要的东西 但没有提出任何代码来显示您为实现目标所做的努力 - 这可能会阻止成员为您提供现成的解决方案,您的问题更有可能被投票关闭。


尽管如此,我还是会扔给你一根骨头,为你指明正确的方向......

查询

  • 假设 UPC 字段是您 Products table 中的主键,您应该使用此字段(相对于 PNAME 字段)在 Purchases table 和 Closing Stock table 中引用您的产品,以便可以唯一标识每个项目。

  • 假设您实施了上述建议,为了产生所需的结果,您需要构造三个单独的查询:

    1. 报告月份内的购买

    2. 开盘价

    3. 收盘价

然后您可以构建第 4th 个查询来显示产品信息以及来自这三个查询的数据。股票查询 (2) 和 (3) 显然都会从 Closing Stock table 中获取数据,但是为不同的月份配置了标准。

1。购买

假设您要报告上个月的情况,购买查询可能类似于:

select 
    pu.upc, sum(pu.quantity) as puqty
from 
    purchases pu
where 
    pu.purdate >= dateserial(year(date),month(date)-1,1) and 
    pu.purdate <  dateserial(year(date),month(date),1)
group by 
    pu.upc

这里,DateSerial函数用于计算上月和当月的开始日期,形成购买日期选择标准的日期边界。

2。期初库存

期初库存的查询更加简单,因为不需要聚合,因为一个产品可以在一个月内多次购买,而一个产品只会有任何给定月份的单一收盘库存数据

因此,期初库存查询可能类似于:

select 
    os.upc, os.quantity as osqty
from 
    [closing stock] os
where 
    os.enddate >= dateserial(year(date),month(date)-2,1) and 
    os.enddate <  dateserial(year(date),month(date)-1,1)

此处,日期边界计算为上个月上个月(即两个月前),因为一个月的收盘库存将是下一个。

3。期末库存。

鉴于上述情况,这现在应该相对简单 - 只需调整上述查询,使日期范围落在上个月内:

select 
    cs.upc, cs.quantity as csqty
from 
    [closing stock] cs
where 
    cs.enddate >= dateserial(year(date),month(date)-1,1) and 
    cs.enddate <  dateserial(year(date),month(date),1)

综合考虑

既然您已经构建了上述三个查询来报告上个月的采购、期初和期末库存,我们现在可以使用一个最终查询将所有这三个查询结合在一起。

为此,我们将在上面构造的每个查询中使用 Products table 和 LEFT JOIN,因为我们总是希望 every 产品出现在结果中,无论该产品是否在上个月内购买过。

因此,在伪代码中,查询将类似于:

select
    p.upc, 
    p.pname, 
    purchases.puqty, 
    openingstock.osqty, 
    closingstock.csqty
from
    (
        (
            products p left join purchases on p.upc = purchases.upc
        )
        left join openingstock on p.upc = openingstock.upc
    )
    left join closingstock on p.upc = closingstock.upc

然后我们可以在此代码中注入我们之前对每个查询的定义以产生最终结果(希望它能工作,因为我已经完全测试了这个 none!):

select
    p.upc, 
    p.pname, 
    purchases.puqty as [Purchased Qty], 
    openingstock.osqty as [Opening Stock], 
    closingstock.csqty as [Closing Stock]
from
    (
        (
            products p left join 
            (
                select 
                    pu.upc, sum(pu.quantity) as puqty
                from 
                    purchases pu
                where 
                    pu.purdate >= dateserial(year(date),month(date)-1,1) and 
                    pu.purdate <  dateserial(year(date),month(date),1)
                group by 
                    pu.upc
            ) 
            purchases on p.upc = purchases.upc
        )
        left join 
        (
            select 
                os.upc, os.quantity as osqty
            from 
                [closing stock] os
            where 
                os.enddate >= dateserial(year(date),month(date)-2,1) and 
                os.enddate <  dateserial(year(date),month(date)-1,1)
        )
        openingstock on p.upc = openingstock.upc
    )
    left join 
    (
        select 
            cs.upc, cs.quantity as csqty
        from 
            [closing stock] cs
        where 
            cs.enddate >= dateserial(year(date),month(date)-1,1) and 
            cs.enddate <  dateserial(year(date),month(date),1)
    )
    closingstock on p.upc = closingstock.upc