如何从表格列表中获得正确的结果

时间:2012-03-26 12:38:30

标签: sql sql-server-2008

目标是检索以下结果:

MaterialNumber ExpiryDate Quantity
-------------- ---------- --------
11111          10-12-2011 50
11111          10-18-2011 100
11111          01-15-2012 500
22222          11-18-2011 0
22222          05-01-2012 200
33333          12-17-2011 200
33333          04-01-2012 -275

问题是我现在不知道如何根据我下面的现有代码实现此结果。 我也有计算问题。

SupplyID MaterialNumber ExpiryDate Quantity
-------- -------------- ---------- --------
1        11111          10-12-2011 100
2        11111          10-18-2011 700
3        11111          01-15-2012 500
4        22222          11-18-2011 250
5        22222          05-01-2012 475
6        33333          12-17-2011 200
7        33333          04-01-2012 300



RequestID MaterialNumber RequiredDate Quantity
--------- -------------- ------------ --------
1         11111          10-01-2011   50
2         11111          10-14-2011   600
3         22222          10-17-2011   400
4         22222          04-02-2012   125
5         33333          12-22-2011   175
6         33333          01-10-2012   400


CREATE TABLE TC74_Supply
(
    SupplyID INT IDENTITY,
    MaterialNumber VARCHAR(5),
    ExpiryDate DATE,
    Quantity INT
)
GO
INSERT INTO TC74_Supply(MaterialNumber,ExpiryDate,Quantity)
SELECT '11111','10-12-2011',100 UNION ALL
SELECT '11111','10-18-2011',700 UNION ALL
SELECT '11111','01-15-2012',500 UNION ALL
SELECT '22222','11-18-2011',250 UNION ALL
SELECT '22222','05-01-2012',475 UNION ALL
SELECT '33333','12-17-2011',200 UNION ALL
SELECT '33333','04-01-2012',300

CREATE TABLE TC74_SupplyRequest(
    RequestID INT IDENTITY,
    MaterialNumber VARCHAR(5),
    RequiredDate DATE,
    Quantity INT
)
GO

INSERT INTO TC74_SupplyRequest(MaterialNumber,RequiredDate,Quantity)
SELECT '11111','10-01-2011',50 UNION ALL
SELECT '11111','10-14-2011',600 UNION ALL
SELECT '22222','10-17-2011',400 UNION ALL
SELECT '22222','04-02-2012',125 UNION ALL
SELECT '33333','12-22-2011',175 UNION ALL
SELECT '33333','01-10-2012',400 

我的源代码尚未完成

SELECT 
    a.SupplyID, 
    a.MaterialNumber, 
    a.ExpiryDate, 
    a.Quantity, 
    a.test1,
    godis =(SELECT top 1 a.Quantity - c.Quantity
            FROM (SELECT 
                    b.RequestID,
                    b.MaterialNumber, 
                    b.RequiredDate, 
                    b.Quantity, 
                    test2 = DENSE_RANK() OVER(PARTITION BY b.MaterialNumber ORDER BY b.RequestID) 
                  FROM TC74_SupplyRequest b) c 
            WHERE MaterialNumber = c.MaterialNumber AND a.test1 = c.test2),
    a.lll
FROM 
(
    SELECT 
        SupplyID, 
        MaterialNumber, 
        ExpiryDate, 
        Quantity, 
        test1 = DENSE_RANK() OVER(PARTITION BY MaterialNumber ORDER BY SupplyID),
        lll = 321
     FROM 
        TC74_Supply
) a

1 个答案:

答案 0 :(得分:0)

所以你手上有一些快速蒸发的东西?如果您需要将从最后到期日期开始的期间的请求加到当前的到期日期,您可以使用:

select *, Quantity - isnull(Demand, 0) Vasted
from TC74_Supply
outer Apply
(
  select sum (Quantity) Demand
    from TC74_SupplyRequest
   where TC74_Supply.MaterialNumber = TC74_SupplyRequest.MaterialNumber
     and TC74_Supply.ExpiryDate >= TC74_SupplyRequest.RequiredDate
     and TC74_SupplyRequest.RequiredDate >=
         (select isnull (max(a.ExpiryDate), 
                            (select min(RequiredDate) from TC74_SupplyRequest))
            from TC74_Supply a
           where a.MaterialNumber = TC74_Supply.MaterialNumber
             and a.ExpiryDate < TC74_Supply.ExpiryDate)
) a

我对'22222'感到好奇。我的号码与你的号码不符,我找不到可以得到确切号码的场景。我想问的问题是:你是否有一些材料在某些日期到期,因此可以通过Supply表中的少数条目来提供请求?

相关问题