库存余额库存显示

时间:2013-04-11 04:03:49

标签: sql-server-2008 tsql inventory

我遇到了一个小问题,我必须通过查询显示库存中的项目显示。我正在从4个表中检索数据,并希望显示类似于下面的输出。表格结构和样本值已在 SQL小提琴中给出。这是 SQL Fiddle for the table structures an values.

我想要的输出是这样的。

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
.
.
.

我花了一个多月的时间做这件事。任何人都可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

可能是这样的: http://sqlfiddle.com/#!3/f977e/50

从限制数据的日期中删除了MIN()。添加了dateadd-datediff以确保删除日期的所有时间。 我看到你对where条款进行了评论。但是你当然可以再添加它。

希望这有帮助。

编辑:

添加了总计。

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

答案 1 :(得分:0)

试试这个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 Fiddle

注意:这不会产生确切的输出作为数据延迟。

修改

假设(我认为你的结构

1. 内向大师外向大师中的日期 相同副-versa 日期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.The Balance:

;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);

<强> Here is the SQL Fiddle to verify