我遇到了SQL中的一种情况,我想在本质上循环遍历查询并让它运行多次,同时将SELECT语句的部分值替换为另一个表中的值。下面是一个简化的例子。
表1
+---------+-------+
| Product | Price |
+---------+-------+
| A | 2 |
+---------+-------+
| B | 4 |
+---------+-------+
| C | 6 |
+---------+-------+
| D | 1 |
+---------+-------+
表2
+--------+
| Volume |
+--------+
| 1 |
+--------+
| 2 |
+--------+
| 3 |
+--------+
当前查询起点
SELECT
PRODUCT
,1 AS 'VOLUME'
,PRICE
,(PRICE * 1) AS 'REVENUE'
FROM dbo.Table1
我开始使用此查询来提供VOLUME = 1时的信息,但我仍然试图弄清楚如何使'1'成为动态并运行Table2中的所有值
表3中的所需输出
+---------+-------+--------+---------+
| Product | Price | Volume | Revenue |
+---------+-------+--------+---------+
| A | 2 | 1 | 2 |
+---------+-------+--------+---------+
| B | 4 | 1 | 4 |
+---------+-------+--------+---------+
| C | 6 | 1 | 6 |
+---------+-------+--------+---------+
| D | 1 | 1 | 1 |
+---------+-------+--------+---------+
| A | 2 | 2 | 4 |
+---------+-------+--------+---------+
| B | 4 | 2 | 8 |
+---------+-------+--------+---------+
| C | 6 | 2 | 12 |
+---------+-------+--------+---------+
| D | 1 | 2 | 2 |
+---------+-------+--------+---------+
| A | 2 | 3 | 6 |
+---------+-------+--------+---------+
| B | 4 | 3 | 12 |
+---------+-------+--------+---------+
| C | 6 | 3 | 18 |
+---------+-------+--------+---------+
| D | 1 | 3 | 3 |
+---------+-------+--------+---------+
我正在使用Microsoft SQL Server 2014
答案 0 :(得分:3)
交叉加入
Select t1.product, t1.price, t2.volume,
t2.volume * t1.price revenue
from table1 t1 cross join table2 t2
测试它
declare @t1 table (product char(1), price int)
declare @t2 table (volume int)
insert @t1(product, price)
values ('A', 2), ('B', 4),('C', 6),('D', 1)
insert @t2(volume) values (1), (2), (3)
Select t1.product, t1.price, t2.volume,
t2.volume * t1.price revenue
from @t1 t1 cross join @t2 t2
答案 1 :(得分:2)
如果您需要批量运行计算,那么您可能想要使用循环:
DECLARE @i INT=
(
SELECT MIN(Volume)
FROM dbo.Table2
);
WHILE @i IS NOT NULL
BEGIN
SELECT t1.PRODUCT,
t1.PRICE,
t2.Volume,
(t1.PRICE * t2.Volume) AS Revenue
FROM dbo.Table1 t1
INNER JOIN dbo.Table2 t2
ON t2.Volume BETWEEN @i AND @i + 10;
SET @i =
(
SELECT MIN(Volume)
FROM dbo.Table2
WHERE Volume > @i + 10
);
END;