Member 10677976 Ответов: 2

Как запросить данные с помощью метода FIFO для инвентаризации в SQL


У меня есть таблица TabBill(IDBill, CreateDate, IDProduct, Number, Price, TotalMoney, Type). Включая счета-фактуры на покупку и продажу
Экс:
IDBill CreateDate IDProduct Number Price TotalMoney Type
P001 01/12/2016 001 10 10.000 100.000 In
P002 03/12/2016 001 5 12.000 60.000 In
S001 05/12/2016 001 4 12.000 48.000 Out
S002 07/12/2016 001 10 15.000 150.000 Out
P005 07/12/2016 002 10 10.000 100.000 In

Теперь я хочу, чтобы запрашивать данные с использованием метода ФИФО для iventories и прибыли в SQL сервере

Спасибо за помощь!

Что я уже пробовал:

Я использую sql server 2005. Вы не могли бы мне помочь?

[no name]

Вы забыли сказать нам, в чем вам нужна помощь.

Member 10677976

мне нужно, чтобы вы помогли мне запросить инвентаризацию и прибыль от таблицы TabBill методом fifo в sql server

[no name]

Это мне ни о чем не говорит. Где запрос, который вы написали? Что не так с вашим запросом?

Member 10677976

Действительно. Я не знаю, с чего начать мой запрос, и у меня нет запроса. Итак, вы можете мне помочь? Пожалуйста...

[no name]

Ах, так вы ожидаете, что мы тогда будем делать? Научить тебя SQL? Написать запрос для вас и сделать вашу работу за вас? www.w3schools.com могу помочь вам начать.

Richard Deeming

Мы программисты, а не бухгалтеры! :)

Даже после прочтения это описание[^], "запрос данных с использованием метода fifo" все еще ничего для меня не значит.

Начните с записи шагов, которые вам нужно будет предпринять, чтобы сгенерировать отчет вручную. Затем попробуйте превратить эти шаги в SQL-запросы.

Если вы все еще боретесь, нажмите "улучшить вопрос" и обновите свой вопрос списком шагов и любым достигнутым прогрессом.

2 Ответов

Рейтинг:
2

David_Wimbley

Вы действительно не предоставили достаточно информации, чтобы помочь вам, и также кажется, что вам более или менее нужен учебник по основам SQL.

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

--First record in is at the top of the list
SELECT * FROM TabBill ORDER BY CreateDate
--To get the first one only
SELECT TOP 1 * FROM TabBill ORDER BY CreateDate


Ваш вопрос действительно относится к порядку по частям запроса.

Если вам нужна помощь в понимании этого SQL, я предлагаю вам использовать google, так как простой поиск учебников по SQL даст вам множество результатов.


Рейтинг:
0

ArjunSingh_as

создание таблицы

CREATE TABLE #TabBill
( 
IDBill varchar(20), CreateDate date, IDProduct varchar(10), Number int, Price money, TotalMoney money, tranType varchar(10)
);

Вставьте значение в соответствии с вашим вопросом

INSERT INTO #TabBill
VALUES( 'P001', 'Jan 12 2016', '1', 10, 10, 100, 'In ' );

INSERT INTO #TabBill
VALUES( 'P002', 'Mar 12 2016', '1', 5, 12, 60, 'In' );

INSERT INTO #TabBill
VALUES( 'S001', 'May 12 2016', '1', 4, 12, 48, 'Out' );

INSERT INTO #TabBill
VALUES( 'S002', 'Jul 12 2016', '1', 10, 15, 150, 'Out' );

INSERT INTO #TabBill
VALUES( 'P005', 'Jul 12 2016', '2', 10, 10, 100, 'In' );

Чтобы получить cumulative_TotalMoney и cumulative_qty

;WITH cte
     AS (SELECT ROW_NUMBER() OVER(ORDER BY CreateDate) AS srno,
                CreateDate,
                IDProduct,
                qty = CASE
                          WHEN tranType = 'out'
                          THEN 0 - Number
                          ELSE Number
                      END,
                TotalMoney = CASE
                                 WHEN tranType = 'out'
                                 THEN 0 - TotalMoney
                                 ELSE TotalMoney
                             END,
                Price,
                tranType
         FROM #TabBill)
     SELECT *,
            SUM(TotalMoney) OVER(PARTITION BY IDProduct ORDER BY srno) AS cumulative_TotalMoney,
            SUM(qty) OVER(PARTITION BY IDProduct ORDER BY srno) AS cumulative_qty
     FROM cte;

Чтобы получить резюме

;WITH cte
     AS (SELECT ROW_NUMBER() OVER(ORDER BY CreateDate) AS srno,
                CreateDate,
                IDProduct,
                qty = CASE
                          WHEN tranType = 'out'
                          THEN 0 - Number
                          ELSE Number
                      END,
                TotalMoney = CASE
                                 WHEN tranType = 'out'
                                 THEN 0 - TotalMoney
                                 ELSE TotalMoney
                             END,
                Price,
                tranType
         FROM #TabBill)
     SELECT IDProduct,
            SUM(TotalMoney) AS 'Profit/Loss',
            SUM(qty) AS 'Remaining Qty'
     FROM cte
     GROUP BY IDProduct;


heval79

я думаю, что TotalMoney (TotalMoney = случай, когда tranType = 'выход', тогда 0 - TotalMoney еще TotalMoney конца)

является некорректным, поскольку его необходимо удалить на
не полный "выход"

например
Дата описание единицы измерения себестоимость единицы измерения общая стоимость
01 июля начало инвентаризации 500 / $20 | $10 000
18 июля инвентарь приобретен 800 | $24 | $19,200
25 июля инвентарь приобретен 700 | $26 | $18,200
_______________________________________________________
Итого ------------------------- 2,000 | | $47,400
продано -------------------------- 1,400 единицы измерения
__________________________________________________
оставшиеся единицы --------------- 600

Общая сумма Денег=600 единиц × $ 26 = $15 600

Как можно решить это состояние