2015-07-20 53 views
0

選定列主鍵我有如下表所示:我想從表中選擇產品代碼011A 30件。每行包含許多部分,列PCS。我想根據日期來選擇FIFO的順序30件,並返回從各行選擇的件數,所以我需要知道有從它所選的作品,每一行的主鍵值。例如,從這個數據:如何獲得行SQL Server 2012中

Key Product Code  PCS Date 
1  011A   10 2015-07-01 
2  011B   20 2015-07-01 
3  011C   20 2015-07-01 
4  011A   12 2015-07-02 
5  011A   40 2015-07-03 
6  011D   60 2015-07-04 
7  011A   20 2015-07-04 

選擇的產品代碼30件「011A」應該給一個輸出表所示:

Key Product Code  PCS DATE 
1  011A   10 2015-07-01 
4  011A   12 2015-07-02 
5  011A   8  2015-07-03 

你可以看到的總條數爲30 ,並且從具有主鍵1和4的行中選擇最大件數,因爲它們是第一個日期。從#5行中只選擇了8個,因爲它是下一個日期順序,只需要8個即可達到30個。第7行不是必需的,所以它不會顯示在結果中。

我如何編寫一個查詢來做到這一點?

+0

爲什麼是關鍵7沒有結果呢?如果添加ProductCode = 011A的PCS值,則不會得到30.爲什麼鍵5的值從40更改爲8?您所需的輸出與樣本不匹配或存在一些您尚未共享的業務規則。我們可以提供幫助,但我們需要了解整個問題。 –

+0

我已經更新了問題租賃看看它。我遵循FIFO方法來選擇PCS數量。和8數量從40中選擇,剩餘數量是32.但我沒有顯示剩餘數量。 –

+0

有沒有人可以幫助我? –

回答

2

在SQL Server 2012中,您可以使用累計總和:

select t.* 
from (select t.*, 
      sum(pcs) over (partition by productcode order by date) as cumepcs 
     from thetable t 
     where productcode = '011A' 
    ) t 
where cumepcs - pcs < 30; 

做在SQL Server 2008的累積總和多做一些工作。這裏有一種方法:

select t.* 
from (select t.*, 
      (select sum(t2.pcs) 
       from thetable t2 
       where t2.productcode = t.productcode and 
        t2.date <= t.date 
      ) as cumepcs 
     from thetable t 
     where productcode = '011A' 
    ) t 
where cumepcs - pcs < 30; 

編輯:

如果你想從每個桶分配的金額,你需要調整的最後一個桶的大小。更改select到:

select t.*, 
     (case when cume_pcs <= 30 then pcs 
      else 30 - (cumepcs - pcs) 
     end) as allocated_pcs 
. . . 
+0

但它沒有顯示正確的結果 –

+0

@SyedZunair。 。 。我懂了。這是給序列中的最後一個鍵添加到30.我只是改變了邏輯,所以它應該給所有的行。 –

+0

現在它給了我三行正確的主鍵,但最後一行的數量是40,但我需要8. –