我有一张地址表,另一张优惠券。我想选择每个地址10张优惠券。我该怎么做?我知道这是非常基本的,但我已经离开SQL有一段时间了,我试着尽我所能重新熟悉它.
表1
Name Address
-------------------
Store 1 Address 1
Store 2 Address 2表2
Coupons
--------
coupon1
coupon2
...
coupon19
coupon20发布于 2020-09-09 17:11:23
您可以使用窗口函数:
select t1.*, t2.coupons
from (
select t1.*, row_number() over(order by id) rn
from table1 t1
) t1
inner join (
select t2.*, row_number() over(order by id) rn
from table2 t2
) t2 on (t2.rn - 1) / 10 = t1.rn其思想是使用row_number()枚举每个表的行,然后使用行号上的一个条件连接结果。以上查询为每个地址提供10张优惠券。
要获得稳定的结果,您需要在每个表中都有一个列(或一组列)来唯一地标识每一行:我假设这两个表中都有id。
发布于 2020-09-09 17:00:24
你想要每家商店10张优惠券吗?每家商店100张优惠券吗?你的问题回答与帖子不同。或者你想在所有商店里平均分配所有的优惠券?这个查询中的一些是构建数据以演示输出,但主要关注的是使用NTILE(10)将优惠券分解为十个组,然后可以将一个ROW_NUMBER应用到它,为您提供每个可以连接的id值10张优惠券.
WITH random_data AS
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS nums
FROM sysobjects
), store_info AS
(
SELECT ROW_NUMBER() OVER (ORDER BY nums) AS join_id,
'Store' + CONVERT(VARCHAR(10),nums) AS StoreName,
'Address' + CONVERT(VARCHAR(10),nums) AS StoreAddress
FROM random_data
), more_random_data AS
(
SELECT ROW_NUMBER() OVER (ORDER BY t2.nums) AS nums
FROM random_data t1
CROSS JOIN random_data t2
), coupons AS
(
SELECT NTILE(10) OVER (ORDER BY nums) AS group_id,
'Coupon' + CONVERT(VARCHAR(10),nums) AS Coupon,
nums
FROM more_random_data
), coupons_with_join_id AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY nums) AS join_id,
Coupon
FROM coupons
)
SELECT StoreName, StoreAddress, Coupon
FROM store_info AS si
JOIN coupons_with_join_id AS cwji
ON si.join_id = cwji.join_id
ORDER BY si.join_id, Coupon发布于 2020-09-09 17:16:38
这里固有的问题是,这两个表之间没有任何关系。因此,您的选项要么强制使用伪关系,就像其他答案显示的那样,要么在这两个表之间创建一个关系,比如向优惠券表中添加一个store_name列。
https://stackoverflow.com/questions/63815892
复制相似问题