Запрос для получения итоговых закупок и закрытия запасов за период - PullRequest
1 голос
/ 11 марта 2019

Моя текущая настройка:

Таблица продуктов

  • UPC (номер)
  • PNAME (текст)

Таблица покупок

  • purDate (Дата)
  • PNAME (поле со списком)
  • Количество (Число)

Закрытие запаса

  • endDate (Дата)
  • PNAME (поле со списком)
  • Количество (Число)

Я хочу создать запрос, в котором перечислены все PNAME из продуктов, общего количества закупок и итогового количества для каждого конца месяца.В конце следующего месяца начальным запасом за предыдущий месяц будет закрытый запас за этот месяц.

Покупки происходят в течение месяца, и мы принимаем заключительный запас в последний день каждого месяца.Я попытался использовать мастер запросов и импортировать PNAME из продуктов, Quantity из закупок и Quantity из закрытия запасов, но я получаю только итоги по закупкам, а итоговая сумма по закрытому запасу пуста.

1 Ответ

0 голосов
/ 12 марта 2019

Во-первых, краткий совет:

Ваш вопрос очень широкий: вы указали, что вы хотите , но не добавили ни одного кодадемонстрация ваших усилий по достижению этой цели - это, скорее всего, отговорит участников от предоставления вам готовых решений, и ваш вопрос, скорее всего, будет закрыт.


Тем не менее, я брошу вамкость, чтобы указать вам правильное направление ...

Запросы

  • Предполагая, что поле 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
...