pvd*_*jay 3 sql-server-2008 cursors cross-apply unpivot
假设我在 SQL Server 2008 中有一个这样的表:
id | name | qty
-------------------
1 | john | 1
2 | bill | 3
3 | mary | 2
4 | jill | 5
Run Code Online (Sandbox Code Playgroud)
我想查询此表并为每批返回 1 行,最多为 2。因此,查询结果如下所示:
id | name | qty
-------------------
1 | john | 1
2 | bill | 2
2 | bill | 1
3 | mary | 2
4 | jill | 2
4 | jill | 2
4 | jill | 1
Run Code Online (Sandbox Code Playgroud)
这可以在不使用光标的情况下整齐地完成吗?这可以使用 unpivot 吗?
顺便说一下,该qty
列的最大值为 10。
使用数字表很容易。由于也qty
不能超过10
,我们只需要一个非常小的数字表:
CREATE TABLE numbers
( i int NOT NULL PRIMARY KEY ) ;
INSERT INTO numbers (i)
VALUES (1), (3), (5), (7), (9) ;
Run Code Online (Sandbox Code Playgroud)
我们只需要奇数,因为结果中所需的行数是一半qty
(或大约一半)。
查询:
SELECT
t.id, t.name,
qty = CASE WHEN n.i = 1 AND t.qty % 2 > 0 THEN t.qty % 2 ELSE 2 END
FROM
tableX AS t
JOIN
numbers AS n
ON
n.i <= t.qty ;
Run Code Online (Sandbox Code Playgroud)
当然我们也可以不用任何辅助表:
SELECT
t.id, t.name,
qty = CASE WHEN n.i = 1 AND t.qty % 2 > 0 THEN t.qty % 2 ELSE 2 END
FROM
tableX AS t
JOIN
(VALUES (1), (3), (5), (7), (9)) AS n (i)
ON
n.i <= t.qty ;
Run Code Online (Sandbox Code Playgroud)
在dbfiddle.uk测试。