2011-08-11 19 views
7

我需要生成我的客戶將要發送商品目錄的地址列表。他們想發送一定數量的目錄(X)到特定的郵政編碼(Y)[這與這些郵政編碼的平均收入有關]從SQL Server表中爲每個類別檢索不同數量的行

我在SQL Server 2008 R2中有兩個表:CatalogRequestsAddressList

CatalogRequests是我們應該有多少個目錄發送到每個郵政編碼在我們的客戶數據庫列表:

| Zip | QuantityRequested | 
------------------------------- 
| 12345 |   150   | 
| 13445 |   800   | 
| 45678 |   200   | 
| 41871 |   350   | 
| 77777 |   125   | 

AddressList就是這樣,地址列表=)

| Name |  Address1 | Address2 |  City  | State | Zip | 
--------------------------------------------------------------------------- 
| Bruce | 1 BatCave Dr |   | Gotham City | IL | 12345 | 
| Clark | 9 Smallville St | Apt A | Metropolis | NY | 45678 | 
| Thor | 5 Valhalla Way |   | Asgard  | ?? | 77777 | 

我試圖用SQL查詢來解決問題,然後放棄並編寫了一個小的C#程序來完成我需要做的事情(基本上,生成一堆SQL查詢 - 每個查詢一個記錄在CatalogRequests)。

我的問題是,我怎麼可以用一個SQL查詢做到這一點?我只是好奇在這一點上,似乎有辦法做到這一點,我只是錯過了一些東西。或者可能不可能,我瘋了=)

結果集將是來自AddressList的記錄,滿足CatalogRequest中的要求(例如,150條記錄的郵政編碼爲12345,800條記錄的郵政編碼爲13445等)。

+0

謝謝你的賞金! –

+0

不客氣,@CodeMagician!當時你的解決方案真的幫了我很大忙。另外,我想[賞金相關的帽子](http://winterbash2014.stackexchange.com/);-) – jadarnel27

回答

11

嗯...大概是這樣的內容:要求在數量

;with addressListWithID 
AS 
(
    SELECT name, address1, adress2, city, state, zip, 
      ROW_NUMBER() OVER(partition by zip order by newid()) as Row 
    FROM AddressList 
) 
SELECT A.name, A.address1, A.adress2, A.city, A.state, A.zip 
FROM addressListWithID A 
    INNER JOIN CatalogRequests C 
     ON C.zip = A.zip 
      AND A.row <= C.QuantityRequested 

隨機地址。

+0

請務必在您的選擇列表中放置表格資格...'zip'會引發模糊的字段名稱錯誤。 – JNK

+0

良好的漁獲,謝謝!查詢已編輯。 –

+1

也許,也許,最好用'A.row BETWEEN 1 AND C.QuantityRequested'替換'A.row <= C.QuantityRequested',因爲這是關於過濾離散值的。 –

4

一種方法是使用動態SQL (which is dangerous and not to be taken lightly)

DECLARE @SQL varchar(max) 

SET @SQL = 'USE Database' 

SELECT @SQL = @SQL + 'SELECT TOP ' 
      + QuantityRequired 
      + ' * FROM AddressList WHERE Zip = ' 
      + Zip 
      + ' UNION ALL' 
FROM CatalogRequests 

SET @SQL = LEFT(@SQL, (LEN(@SQL - 10))) -- remove last UNION ALL 

PRINT (@SQL) 

-- EXEC (@SQL) 

檢查鏈接,動態SQL標準基準。

+0

+1很酷!這與我的代碼所做的相似 - 這會爲我節省一些時間,知道我可以在SQL中執行此操作。謝謝! – jadarnel27

5

未經檢驗的,因爲沒有DDL並沒有測試數據:

SELECT A.name , 
     A.address1 , 
     A.adress2 , 
     A.city , 
     A.[state] , 
     A.zip 
FROM CatalogRequests AS C 
     CROSS APPLY (SELECT TOP (C.QuantityRequested) 
           A.name , 
           A.address1 , 
           A.adress2 , 
           A.city , 
           A.[state] , 
           A.zip 
         FROM  addressListWithID AS A 
         WHERE  C.zip = A.zip 
        ) AS A 
+0

+1已測試,它的工作原理...我不知道這是可能的與'CROSS APPLY',很高興知道! – James

+0

絕對有效,謝謝你的回答! +1這個比MagicMike的答案更可讀 – jadarnel27

相關問題