Во-первых, краткий совет:
Ваш вопрос очень широкий: вы указали, что вы хотите , но не добавили ни одного кодадемонстрация ваших усилий по достижению этой цели - это, скорее всего, отговорит участников от предоставления вам готовых решений, и ваш вопрос, скорее всего, будет закрыт.
Тем не менее, я брошу вамкость, чтобы указать вам правильное направление ...
Запросы
Предполагая, что поле UPC
является первичным ключом в вашей таблице Products
, выследует использовать это поле (в отличие от поля PNAME
) для ссылки на ваши продукты как в вашей таблице Purchases
, так и в таблице Closing Stock
, чтобы каждый элемент мог быть однозначно идентифицирован.
Предполагая, что вы реализуете приведенный выше совет, для получения желаемого результата вы захотите построить три отдельных запроса:
Закупки в течение отчетного месяца
Начальный запас
Закрытый запас
Затем можно построить запрос 4 th , чтобы отобразить информацию о продукте вместе с данными этих трех запросов.Оба биржевых запроса (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
для каждого из построенных выше запросов, так как мы всегда хотим, чтобы каждый продукт появлялся в результате, независимо от того, был ли продукт приобретен в предыдущемmonth.
Итак, в псевдокоде запрос будет выглядеть примерно так:
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