Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL Server表中检索每个类别的不同行数_Sql_Sql Server - Fatal编程技术网

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

从SQL Server表中检索每个类别的不同行数,sql,sql-server,Sql,Sql Server,我需要生成我的客户将商品目录发送到的地址列表。他们希望将一定数量的目录X发送到特定的邮政编码Y[这与这些邮政编码中的平均收入有关] 我在SQLServer2008R2中有两个表:CatalogRequests和AddressList CatalogRequests是我们应向客户数据库中的每个邮政编码发送多少目录的列表: | Zip | QuantityRequested | ------------------------------- | 12345 | 150

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

我在SQLServer2008R2中有两个表:CatalogRequests和AddressList

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

|  Zip  |  QuantityRequested  |
-------------------------------
| 12345 |         150         |
| 13445 |         800         |
| 45678 |         200         |
| 41871 |         350         |
| 77777 |         125         |
地址列表就是一个地址列表=

|  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要求的记录,例如,邮政编码为12345的150条记录,邮政编码为13445的800条记录,等等。

一种方法是使用动态SQL:


检查动态SQL上规范引用的链接。

Hmm。。。像这样的东西怎么样:

;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 

请求数量的随机地址

未测试,因为没有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

请确保将表格资格放在您的选择列表中…zip将抛出一个模棱两可的字段名错误。也许,只是也许,替换A行会更好。所有3个答案都很好,但我喜欢这一个的随机性,它运行得更快一点。谢谢+1已测试且有效…我不知道交叉申请可以做到这一点,很高兴知道!绝对有效,谢谢你的回答+1因为这个比MagicMike的答案更具可读性+1非常酷!这与我的代码所做的类似——如果我知道我可以用SQL来做这件事,那么这将节省我一些时间。谢谢谢谢你的赏金!不客气,@code魔术师!你的解决方案当时确实帮了我的忙。另外,我想要-
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