2015-06-17 30 views
0

選擇從一個表基於數量的行的數量因此,與此select語句(不含聯接和WHERE子句)如何從另一個

SELECT [ProductNo], (mf_btol.OrderedBoxes - mf_btol.ActualBoxes) as [Remaining], [DespatchOrderNo] 

這給需要的剩餘產品和箱量清單完成一個訂單。

我想要做的是從一張單獨的庫存表中選擇並顯示一定數量的盒子記錄,這個盒子記錄的數量取決於每件產品的需求數量,因此我將能夠創建一個盒子列表來選擇訂單。

我想我需要使用select top...並使用order by優先考慮要挑選的方框,但無法想象如何獲取數量。

下面是一些由數據,因此上述選擇的結果將是沿着這

ProductNo  Remaining  DespatchOrderNo 
845121   3    6194 
989222   2    6194 

行什麼,我想是

DOTNo  ProductNo  DespatchOrderNo 
123456 845121   6194 
123457 845121   6194 
123458 845121   6194 
124444 989222   6194 
124445 989222   6194 

所以它基本上創建一個列表爲了滿足多個產品的第一個選擇語句中的訂單所需要的庫存表上的單個盒子(由點號唯一)。

+0

是否可以提供示例輸入表和所需的輸出表? –

+0

您是否需要查詢才能返回僅限一種產品的包裝箱清單? –

+0

請編輯您的問題以包含一些樣品數據和所需結果。 –

回答

0

創建樣本數據(你應該已經做了一部分自己)

CREATE TABLE a 
(
ProductNo int, 
OrderedBoxes int, 
ActualBoxes int, 
DespatchOrderNo int 
) 

INSERT INTO a VALUES 
(845121, 5,2, 6194), 
(989222, 3,1, 6194) 

CREATE TABLE b 
(
ProductNo int, 
DOTNo int 
) 

INSERT INTO b VALUES 
(845121, 123453), 
(845121, 123454), 
(845121, 123455), 
(989222, 124442), 
(989222, 124443) 

更新:

假設它是真正的SQL Server 2000 ,我認爲(雖然不能測試)一個動態的SQL解決方案應該可以工這樣的事情(在我的2012版進行測試,不認爲這是什麼2000不能做)

DECLARE @Sql varchar(8000) = '' 
SELECT @Sql = @Sql + 
     'SELECT * FROM (SELECT TOP '+ CAST((OrderedBoxes - ActualBoxes) as varchar) + ' DOTNo, a.ProductNo, DespatchOrderNo 
     FROM a 
     INNER JOIN b ON(a.ProductNo = b.ProductNo) 
     WHERE a.ProductNo = '+ CAST(a.ProductNo as varchar) +' 
     ORDER BY DOTNo) iq UNION ALL ' 
FROM a 

SET @Sql = LEFT(@Sql, LEN(@Sql) - 10) -- remove the last union all 

EXEC(@Sql) 

對於或更高版本(和你真的應該升級SQL因爲不再支持2000由微軟), 這裏是一個解決方案與cteROW_NUMBER

WITH CTE AS (
SELECT OrderedBoxes - ActualBoxes As Remaining, 
     DOTNo, a.ProductNo, 
     DespatchOrderNo, 
     ROW_NUMBER() OVER(PARTITION BY a.ProductNo ORDER BY DOTNo) RN 
FROM a INNER JOIN 
b ON(a.ProductNo = b.ProductNo) 
) 

SELECT DOTNo, ProductNo, DespatchOrderNo 
FROM CTE 
WHERE RN <= Remaining 

輸出:

DOTNo  ProductNo DespatchOrderNo 
----------- ----------- --------------- 
123453  845121  6194 
123454  845121  6194 
123455  845121  6194 
124442  989222  6194 
124443  989222  6194 
+0

您是否希望OP有誤 - 用[tag:sql-server-2000]標記問題?因爲它是一個沒有CTE和'ROW_NUMBER()'的奇妙世界(在'INSERT'的'VALUES'子句中不是多行,由 –

+0

@Damien_The_Unbeliever Oops,我沒有看到...... cte很容易用派生的查詢替換,我相信row_number()功能可以使用僅支持sql server 2000支持的sql來編寫,儘管我不認爲它會很漂亮或執行得很好...我知道的其他選項正在使用遊標或動態SQL。 –

+0

我編輯了我的答案,包括2000年的解決方案,但我無法在2000年進行測試。請檢查它是否正常。 –