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

时间:2019-03-11 20:25:02

标签: sql ms-access ms-access-2016

我当前的设置:

产品表

  • UPC(数字)
  • PNAME(文本)

购买表

  • purDate(Date)
  • PNAME(组合框)
  • 数量(数量)

关闭库存

  • endDate(Date)
  • PNAME(组合框)
  • 数量(数量)

我想创建一个查询,列出每个月末产品中的所有PNAME,已购买的总金额和结束数量。在下个月末,上个月的期末存货将成为该月的期初存货。

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

1 个答案:

答案 0 :(得分:0)

首先,简短的建议是:

您的问题非常广泛,因为您已经声明了自己想要的内容,但没有添加任何代码来表明您的努力目标-这很可能会阻止成员向您提供现成的信息-解决方案,您的问题更有可能被投票关闭。


尽管如此,我还是会扔给您一根骨头,以使您指向正确的方向...

查询

  • 假设UPC字段是Products表中的主键,则应使用此字段(而不是PNAME字段)来引用您的产品Purchases表和Closing Stock表,以便可以唯一地标识每个项目。

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

    1. 报告月份内的购买

    2. 期初存货

    3. 关闭库存

然后,您可以构造第4个 查询,以在这三个查询的数据旁边显示产品信息。库存查询(2)和(3)显然都将从Closing Stock表中获取数据,但是配置的标准分别针对不同月份。

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表与LEFT JOIN一起使用,因为我们总是希望所有产品出现在结果中,不管产品是否在上个月内购买过。

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

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

然后我们可以在此代码中注入我们对每个查询的较早定义,以产生最终结果(由于我完全没有测试任何结果,因此有望奏效!)

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