从SQL Server表中检索每个类别的不同行数

Jos*_*ell 7 sql sql-server

我需要生成一个地址列表,我的客户将发送商品目录.他们希望将特定数量的目录(X)发送到特定的邮政编码(Y)[这与这些邮政编码中的平均收入有关]

我在SQL Server 2008 R2中有2个表:CatalogRequestsAddressList

CatalogRequests 是我们应该向客户数据库中的每个邮政编码发送多少目录的列表:

|  Zip  |  QuantityRequested  |
-------------------------------
| 12345 |         150         |
| 13445 |         800         |
| 45678 |         200         |
| 41871 |         350         |
| 77777 |         125         |
Run Code Online (Sandbox Code Playgroud)

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 |
Run Code Online (Sandbox Code Playgroud)

我试着用SQL查询做了一段时间我的大脑,然后放弃并写了一个小的C#程序来做我需要做的事情(基本上,生成一堆SQL查询 - 每个记录一个CatalogRequests).

我的问题是,我怎么能用一个SQL查询完成这个?我只是好奇这一点,似乎有办法做到这一点,我只是遗漏了一些东西.或者可能不可能,我很疯狂=)

结果集将是AddressList满足要求的记录CatalogRequest(例如,150个邮政编码为12345的记录,800个记录,邮政编码为13445等).

Cod*_*ian 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 
Run Code Online (Sandbox Code Playgroud)

请求数量的随机地址.


A-K*_*A-K 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
Run Code Online (Sandbox Code Playgroud)