2011-04-30 66 views
2

我有一個結果集如下:SQL運行減法

Item ExpectedQty ReceivedQty Short 
Item01 30   45   5 
Item01 20   45   5 

Item02 40   38   2 

item03 50   90   10 
item03 30   90   10 
item03 20   90   10 

查詢:

select a.Item, a.ExpectedQty,b.ReceivedQty, b.Short 
from a join b on a.Item = b.Item 

我需要得到結果作爲第二個圖表。基本上,我在每一行中都有收到的總數量,如果需要在最後一行顯示任何短缺,我需要顯示收到的數量與預期數量的關係。

預計:提前

Item ExpectedQty ReceivedQty Short 
item01 30   30   0 
item01 20   15   5 

item02 40   38   2 

item03 50   50   0 
item03 30   30   0 
item03 20   10   10 

感謝。

編輯, Vession 02;

-- Just a brief of business scenario is table has been created for a good receipt. 
-- So here we have good expected line with PurchaseOrder(PO) in first few line. 
-- And then we receive each expected line physically and that time these 
-- quantity may be different 
-- due to business case like quantity may damage and short quantity like that. 
-- So we maintain a status for that eg: OK, Damage, also we have to calculate 
-- short quantity 
-- based on total of expected quantity of each item and total of received line. 


if object_id('DEV..Temp','U') is not null 
drop table Temp 

CREATE TABLE Temp 
(  
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,   
Item VARCHAR(32), 
PO VARCHAR(32) NULL,   
ExpectedQty INT NULL, 
ReceivedQty INT NULL, 
[STATUS] VARCHAR(32) NULL, 
BoxName VARCHAR(32) NULL 
) 


-- Please see first few line with PO data will be the expected lines, 
-- and then rest line will be received line 

INSERT INTO TEMP (Item,PO,ExpectedQty,ReceivedQty,[STATUS],BoxName) 
SELECT 'ITEM01','PO-01','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM01','PO-02','20',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM02','PO-01','40',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-01','50',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-02','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-03','20',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM04','PO-01','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM01',NULL,NULL,'20','OK','box01' UNION ALL 
SELECT 'ITEM01',NULL,NULL,'25','OK','box02' UNION ALL 
SELECT 'ITEM01',NULL,NULL,'5','DAMAGE','box03' UNION ALL 
SELECT 'ITEM02',NULL,NULL,'38','OK','box04' UNION ALL 
SELECT 'ITEM02',NULL,NULL,'2','DAMAGE','box05' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box06' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box07' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box08' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'10','DAMAGE','box09' UNION ALL 
SELECT 'ITEM04',NULL,NULL,'25','OK','box10' 



-- Below Table is my expected result based on above data. 
-- I need to show those data following way. 
-- So I appreciate if you can give me an appropriate query for it. 
-- Note: first row is blank and it is actually my table header. :) 

SELECT ''as'ITEM', ''as'PO#', ''as'ExpectedQty',''as'ReceivedQty', 
''as'DamageQty' ,''as'ShortQty' UNION ALL 

SELECT 'ITEM01','PO-01','30','30','0' ,'0' UNION ALL 
SELECT 'ITEM01','PO-02','20','15','5' ,'0' UNION ALL 
SELECT 'ITEM02','PO-01','40','38','2' ,'0' UNION ALL 
SELECT 'ITEM03','PO-01','50','50','0' ,'0' UNION ALL 
SELECT 'ITEM03','PO-02','30','30','0' ,'0' UNION ALL 
SELECT 'ITEM03','PO-03','20','10','10','0' UNION ALL 
SELECT 'ITEM04','PO-01','30','25','0' ,'5' 
+0

你有沒有意識到的是,更新後您的問題就變成了完全不同的?你應該把它作爲一個新問題發佈(如果需要,可以參考這個問題)。 – 2011-05-03 07:31:07

+0

是的,我同意了。我更新了另一個線程。如果你有一分鐘​​,請穿過它。 http://stackoverflow.com/questions/5866913/sql-running-subtraction – user459295 2011-05-03 08:24:58

回答

1

一部分是獲得預期的項目qunatities的運行總計。爲此,您需要一種方法來區分具有相同物品的行和相同物品數量的排序規則。

爲了試圖解決您的問題,我將假定有一個時間戳列,其值提供卸載順序,並且在同一個項目組中是唯一的。

這裏的樣本數據定義我是在試探我的解決方案:

CREATE TABLE TableA (Item varchar(50), ExpectedQty int, Timestamp int); 
INSERT INTO TableA 
SELECT 'Item01', 30, 1 UNION ALL 
SELECT 'Item01', 20, 2 UNION ALL 
SELECT 'Item02', 40, 1 UNION ALL 
SELECT 'item03', 50, 1 UNION ALL 
SELECT 'item03', 30, 2 UNION ALL 
SELECT 'item03', 20, 3; 

CREATE TABLE TableB (Item varchar(50), ReceivedQty int); 
INSERT INTO TableB 
SELECT 'Item01', 45 UNION ALL 
SELECT 'Item02', 38 UNION ALL 
SELECT 'item03', 90; 

下面是我的解決方案:

SELECT 
    Item, 
    ExpectedQty, 
    ReceivedQty = CASE 
    WHEN RemainderQty >= 0 THEN ExpectedQty 
    WHEN RemainderQty < -ExpectedQty THEN 0 
    ELSE RemainderQty + ExpectedQty 
    END, 
    Short = CASE 
    WHEN RemainderQty >= 0 THEN 0 
    WHEN RemainderQty < -ExpectedQty THEN ExpectedQty 
    ELSE ABS(RemainderQty) 
    END 
FROM (
    SELECT 
    a.Item, 
    a.ExpectedQty, 
    RemainderQty = b.ReceivedQty - a.RunningTotalQty 
    FROM (
    SELECT 
     a.Item, 
     a.Timestamp, 
     a.ExpectedQty, 
     RunningTotalQty = SUM(a2.ExpectedQty) 
    FROM TableA a 
     INNER JOIN TableA a AS a2 ON a.Item = a2.Item AND a.Timestamp >= a2.Timestamp 
    GROUP BY 
     a.Item, 
     a.Timestamp, 
     a.ExpectedQty 
) a 
    INNER JOIN TableB b ON a.Item = b.Item 
) s 
+0

優秀的安德烈M,太棒了。 – user459295 2011-05-01 14:02:47

+0

請參閱我上面編輯的問題。我改變了表格結構,查詢應該適用於同一項目的多個接收行。 – user459295 2011-05-03 07:33:55

+0

有時更改的問題需要對接受的答案進行很小的更改。我很抱歉,但你的情況並非如此。如果您發現很難在沒有幫助的情況下更改我的解決方案以符合您的新要求,請發佈一個新問題。說明你的問題,發佈你已經有的解決方案,並指定它的限制。這樣,事情不會變得混亂,因爲當人們不斷地編輯他們的問題和答案時可能會變得麻煩。 – 2011-05-03 08:14:15

1
問題
select a.Item, a.ExpectedQty,b.ReceivedQty, (a.ExpectedQty - b.ReceivedQty) as 'Short' from a join b on a.Item = b.Item 
0
SELECT a.ExpectedQty, 
    b.ReceivedQty, 
    CASE WHEN b.ReceivedQty < a.ExpectedQty 
     THEN b.ReceivedQty - a.ExpectedQty 
     ELSE 0 
    END Short 
FROM dbo.a a 
INNER JOIN dbo.b b 
ON  a.ItemId = b.ItemId