2011-08-11 9 views
7

クライアントが商品カタログを送信するアドレスのリストを生成する必要があります。 [特定の郵便番号(Y)に特定の数のカタログ(X)を送信したい[これは、これらの郵便番号の平均所得と関係している]SQL Serverテーブルから各カテゴリの行数を取得します

私はSQL Server 2008 R2で2台のテーブルを持っている:CatalogRequestsAddressList )=

AddressList

| Zip | QuantityRequested | 
------------------------------- 
| 12345 |   150   | 
| 13445 |   800   | 
| 45678 |   200   | 
| 41871 |   350   | 
| 77777 |   125   | 
だけでは、アドレスのリストである:

CatalogRequests

は、我々の顧客データベース内の各郵便番号に送信する必要がありますどのように多くのカタログのリストです

私はSQLクエリでこれをやろうとしている間に頭を抱えてしまいました。そして、私がやらなければならなかった小さなC#プログラムを書きました(基本的には、 CatalogRequestsに記録)。

私の質問は、どのように私はこれを1つのSQLクエリで行うことができましたか?私はちょうどこの時点で興味があります、それを行う方法があるように思えます、そして、私はただ何かを欠いています。または可能でない可能性があり、私は夢中です=)

結果セットは、CatalogRequestの要件を満たすAddressListのレコードです(たとえば、郵便番号が12345の150レコード、郵便番号が13445など)。

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

は恵みをありがとう! –

+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 <= C.QuantityRequested'を 'A.row BETWEEN 1 and C.QuantityRequested'に置き換える方がよいでしょう。 –

4

一つの方法は、動的SQL (which is dangerous and not to be taken lightly)を使用することです。

+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

関連する問題