Отображение складского баланса

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

Результат, который я хочу, такой.

Date                    ItemName        Rate     InQty  OutQty  Balance ItemUnit
2013-01-04 00:00:00.000 Sand            0.000    10    5        5       NONE
2013-01-04 00:00:00.000 Backhoe Loader  650.000  20    2        18      Hr
2013-01-04 00:00:00.000 Tractor Troley  150.000  10    0        10      Hr

2013-02-04 00:00:00.000 Sand            0.000    0     5        0       NONE
2013-02-04 00:00:00.000 Backhoe Loader  650.000  5     2        21      Hr
2013-02-04 00:00:00.000 Tractor Troley  150.000  10    30       -10     Hr
.
.
.

Я потратил на это больше месяца. Может ли кто-нибудь помочь мне?


person Kunal    schedule 11.04.2013    source источник
comment
И в чем именно вопрос здесь?!?!?!?   -  person marc_s    schedule 11.04.2013
comment
Вопрос в том, что я хочу, чтобы образец выводился, как показано выше, я написал структуры запросов и таблиц в ссылке скрипта sql sqlfiddle.com/#!3/f977e/1/0, не могли бы вы мне помочь? я редактирую свои вопросы   -  person Kunal    schedule 11.04.2013
comment
Не могли бы вы объяснить логику вывода, который вы хотите?   -  person Rachcha    schedule 11.04.2013
comment
логика заключается в том, что я хочу видеть элементы IN, OUT и BALANCE на каждую дату, для этого мне нужно получить данные из 4 таблиц. Можете ли вы помочь мне построить запрос для этого?   -  person Kunal    schedule 11.04.2013


Ответы (2)


Может быть что-то вроде этого: http://sqlfiddle.com/#!3/f977e/50

Удалены MIN() из дат, так как это ограничивает данные. Добавлен dateadd-datediff, чтобы убедиться, что все времена в датах удалены. Как видите, я прокомментировал пункт where. Но вы можете добавить его снова, конечно.

Надеюсь это поможет.

ИЗМЕНИТЬ:

Добавлен общий итог.

http://sqlfiddle.com/#!3/f977e/75

person Johan    schedule 12.04.2013
comment
да, это почти то, что я хочу, но было бы здорово, если бы мы могли добавить еще 1 столбец в качестве общего баланса, который мог бы показать общий баланс как общую сумму, доступную в нашем примере инвентаря баланс 1-1-13 + баланс 1-2-13=большой баланс, см. колонку баланса в вопросе. - person Kunal; 13.04.2013
comment
О, большое спасибо, это идеальное решение. Большое спасибо - person Kunal; 15.04.2013

Попробуйте это Query:

SELECT 
DISTINCT
CONVERT(DATETIME,CONVERT(DATE,I.[Date]),101) AS [Date],
I.Nameofitem AS ItemName,
I.Rate AS RATE,
I.Qty AS InQty,
ISNULL(O.Qty,0) AS OutQty,
ISNULL(I.Qty,0)-ISNULL(O.Qty,0) AS Balance,
O.unit AS ItemUnit
FROM Outwards_Master O
RIGHT JOIN Inwards_Master I ON O.Nameofitem=I.Nameofitem
                                AND CONVERT(DATE,O.[Date])=CONVERT(DATE,I.[Date])

скрипт SQL

Примечание. Это не даст точных выходных данных, поскольку данные откладываются.

Изменить:

Предположения (которые, я думаю, есть в вашей Структуре)

1. Все даты в Inward Master и Outward Master одинаковы и наоборот< /strong> И Дата PRIMARY KEY

2. У каждого предмета есть столбцы Входящие и Количество исходящих товаров для каждой Даты.

С приведенным выше предположением здесь SQL Query

1. Таблица TEMP

SELECT 
DENSE_RANK() over(order by I.Date) AS [RANK],
ROW_NUMBER()over(partition by I.Date order by I.Date) AS [VersionId],
I.Date,
I.Nameofitem,
I.Rate,
ISNULL(I.Qty,0) AS INQTY,
ISNULL(O.Qty,0) AS OUTQTY,
I.unit
INTO #TEMP1
FROM 
#Inwards_Master I
INNER JOIN #Outwards_Master O ON CONVERT(DATE,O.[Date])=CONVERT(DATE,I.[Date])
            AND I.Nameofitem=O.Nameofitem

SELECT * FROM #TEMP1 ORDER BY Date,Nameofitem

2. Баланс:

;WITH x AS
(
    SELECT 
        [Rank],
        [VersionId],
        Nameofitem,
        [Date],
        INQTY,
        OUTQTY,
        bal=(INQTY-OUTQTY)
    FROM #temp1
    WHERE [Rank] = 1
    UNION ALL
    SELECT 
        y.[Rank],
        y.[VersionId],
        y.Nameofitem,
        y.[Date],
        y.INQTY,
        y.OUTQTY,
        x.bal+(y.INQTY-y.OUTQTY)
    FROM x INNER JOIN #temp1 AS y
    ON y.[Rank] = x.[Rank] + 1
    AND y.VersionId=x.VersionId
    and y.Nameofitem=x.Nameofitem
)
SELECT 
    [Date],
    Nameofitem,
    INQTY,
    OUTQTY,
    Balance = bal
FROM x
ORDER BY Date,Nameofitem
OPTION (MAXRECURSION 10000);

Вот скрипт SQL для проверки

person Prahalad Gaggar    schedule 11.04.2013
comment
спасибо, но я также хочу, чтобы баланс предыдущего дня был добавлен к текущему дню и показывал общий баланс, то есть последний показанный баланс должен показывать общий баланс после всех входов, выходов всех предыдущих дней и еще 1 вещь, которую я есть разные тендеры, но я хочу видеть только необходимые данные тендера, а не все, можете ли вы предложить какие-либо изменения? - person Kunal; 11.04.2013
comment
Я только что пришел. Позвольте мне посмотреть, смогу ли я это сделать. - person Prahalad Gaggar; 11.04.2013
comment
спасибо еще раз, я буду очень рад решить эту проблему. - person Kunal; 11.04.2013