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