我有这样的表planets
:
id Planet Name
---------------
1 Sun Sun
2 Moon Mon
3 Mars Tue
4 Mercury Wed
5 Jupiter Thu
6 Venus Fri
7 Saturn Sat
如果我选择' Sun'然后我希望我的查询返回
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
如果我选择'周一'然后我希望我的查询返回
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
如果我选择'星期二'然后我希望我的查询返回
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
如果我选择' Wed'然后我希望我的查询返回
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
如果我选择'周四'然后我希望我的查询返回
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
如果我选择'周五'然后我希望我的查询返回
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
如果我选择周六'然后我希望我的查询返回
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
老实说,我试图获得但是我能够使用excel实现这一点,但不知道如何在SQL中做任何帮助非常感谢
答案 0 :(得分:2)
我创建了一个SQL Fiddle来构建您尝试构建的序列。
Planets
表略有改动,让Sun从零开始,因为下一部分读的更清晰。
Create Table dbo.Planets
(
id int not null primary key
,planet nvarchar(20) not null
,day nvarchar(3) not null
);
Go
Insert dbo.Planets
Values
(0,'Sun','Sun') -- (Not really a planet...)
,(1,'Moon','Mon')
,(2,'Mars','Tue')
,(3,'Mercury','Wed')
,(4,'Jupiter','Thu')
,(5,'Venus','Fri')
,(6,'Saturn','Sat');
-- (...looks like Uranus didn't make the cut.)
Go
诀窍是只使用common table expression进行迭代,并了解modulo(%
)的工作原理。
With PlanetSequence As
(
Select id
,planet
,day
,iterations = 0
From dbo.Planets
Where day = 'Sun' -- Could pass in a parameter here
Union All
-- As the recursive section of this CTE, this is
-- responsible for selecting the next item in
-- in the sequence.
Select Planets.id
,Planets.planet
,Planets.day
,iterations = PlanetSequence.iterations + 1
From dbo.Planets
Join PlanetSequence
On (PlanetSequence.id + 5) % 7 = Planets.id
Where PlanetSequence.iterations < 20
)
Select Planet From PlanetSequence
结果:
PLANET
--------
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars