创建一个包含3个交叉连接的序列

时间:2018-04-09 00:23:28

标签: sql sql-server tsql

dbo.digits是一个包含10行的表,该列名为n,从1到10

开始

•使用别名Hundreds,Tens和Units加入dbo.digits(3次) •使用别名CharacterNumbersFromZeroTo999派生支持前导零的字符列 •提示:使用union或复合谓词来创建查询

代码应该是这样的

SELECT CharacterNumbersFromZeroTo999 = 
from dbo.Digits AS Hundreds
cross join dbo.Digits AS Tens
cross join dbo.Digits AS Units

enter image description here 我首先尝试使用一个以000开头并递增111的序列,将其转换为char。但是,如何使其适合数百,数十和单位列。起初我认为我的模式是10,这将是每列的值,但我如何保持序列的值?接下来挑战如何从第11行开始创建序列。我注意到当我将代码作为SELECT *运行并注释掉' characterNumbersFromZeroTo999'柱。我得到了这个输出:

row 1  1    1   1
       1    2   1
       1    3   1
       1    4   1
       1    5   1
       1    6   1
       1    7   1
       1    8   1
       1    9   1
       1    10  1
row 11 1    1   2
       1    2   2
       1    3   2
       1    4   2
       1    5   2
       1    6   2
       1    7   2
       1    8   2
       1    9   2
       1    10  2
row 21 1    1   3
       1    2   3
       1    3   3
       1    4   3
       1    5   3
       1    6   3
       1    7   3
       1    8   3
       1    9   3
       1    10  3
row 31 1    1   4

我可以看到,对于第11行,如果我使用这些值112并将其转换为012并且可以添加111的序列,那么它将起作用。我只是没有看到如何做到这一点。任何帮助或任何有类似问题的地方的链接都会很棒。感谢。

2 个答案:

答案 0 :(得分:0)

数字应为0到9之间的数字,而不是1到10之间的数字。

你几乎就在那里。下一步是乘法和减1:

SELECT (hundreds.n * 100 + tens.n * 10 + units - 1) as CharacterNumbersFromZeroTo999
from dbo.Digits Hundreds cross join
     dbo.Digits Tens cross join
     dbo.Digits Units;

您可以将其转换为字符串,然后使用传统方法将其填充:

SELECT right('000' + cast(hundreds.n * 100 + tens.n * 10 + units as varchar(32)), 3) as CharacterNumbersFromZeroTo999
from dbo.Digits Hundreds cross join
     dbo.Digits Tens cross join
     dbo.Digits Units;

或者,如果你想要聪明:

SELECT right(cast(10000 + hundreds.n * 100 + tens.n * 10 + units as varchar(32)), 3) as CharacterNumbersFromZeroTo999
from dbo.Digits Hundreds cross join
     dbo.Digits Tens cross join
     dbo.Digits Units;

如果值是字符串,则可以忽略它们使用row_number()

SELECT right('000' + cast(row_number() over (order by (select null)) - 1 as varchar(32)), 3) as CharacterNumbersFromZeroTo999
from dbo.Digits Hundreds cross join
     dbo.Digits Tens cross join
     dbo.Digits Units;

答案 1 :(得分:0)

借助Row_Number()和Format()

可能会有一些小麻烦
Select Nmbrs = Format(Row_Number() Over (Order By (Select NULL)) - 1,'000')
  From       Digits n1
  Cross Join Digits n2
  Cross Join Digits n3