0

我遇到了一个小问题,我必须通过查询显示库存中的物品显示。我正在从 4 个表中检索数据,并希望显示类似于下面的输出。表结构和示例值已在SQL fiddle中给出。这是表结构和值的 SQL Fiddle。

我想要的输出是这样的。

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

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

4

2 回答 2

1

也许是这样的:http ://sqlfiddle.com/#!3/f977e/50

从日期中删除,MIN()因为它限制了数据。添加dateadd-datediff以确保删除日期的所有时间。如您所见,我评论了该where条款。但是你当然可以再次添加它。

希望这可以帮助。

编辑 :

加总。

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

于 2013-04-12T15:16:03.843 回答
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小提琴

注意:由于数据延迟,这不会产生确切的输出。

编辑:

假设(我认为你的结构中有)

1. Inward MasterOutward Master中的所有日期相同反之亦然日期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 Fiddle

于 2013-04-11T06:21:59.393 回答