我当前的设置:
产品表
购买表
关闭库存
我想创建一个查询,列出每个月末产品中的所有PNAME
,已购买的总金额和结束数量。在下个月末,上个月的期末存货将成为该月的期初存货。
整个月都进行采购,我们在每个月的最后一天进行期末库存。我尝试使用查询向导并从产品中导入PNAME
,从采购中导入Quantity
,并从期末存货中导入Quantity
,但是我只获取了采购总额和期末存货总额为空。
答案 0 :(得分:0)
首先,简短的建议是:
您的问题非常广泛,因为您已经声明了自己想要的内容,但没有添加任何代码来表明您的努力目标-这很可能会阻止成员向您提供现成的信息-解决方案,您的问题更有可能被投票关闭。
尽管如此,我还是会扔给您一根骨头,以使您指向正确的方向...
假设UPC
字段是Products
表中的主键,则应使用此字段(而不是PNAME
字段)来引用您的产品Purchases
表和Closing Stock
表,以便可以唯一地标识每个项目。
假设您实施了上述建议,以产生所需的结果,则需要构造三个单独的查询:
报告月份内的购买
期初存货
关闭库存
然后,您可以构造第4个 查询,以在这三个查询的数据旁边显示产品信息。库存查询(2)和(3)显然都将从Closing Stock
表中获取数据,但是配置的标准分别针对不同月份。
假设您要报告前一个月的数据,则有关购买的查询可能类似于:
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
函数用于计算上一个和当前月份的开始日期,形成购买日期选择标准的日期边界。
对期初存货的查询甚至更加简单,因为不需要汇总,因为一个产品可以在一个月内多次购买,而一个产品只能有一个单个给定月份的收盘价。
因此,“期初存货”查询可能类似于:
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)
此处,日期边界被计算为上个月的上个月(即两个月前)的月份,因为一个月的期末存货将成为下个月的期初存货。
>鉴于上述情况,这现在应该相对简单-只需对上述查询进行调整,以使日期范围落在上个月内即可:
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