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
我首先尝试使用一个以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的序列,那么它将起作用。我只是没有看到如何做到这一点。任何帮助或任何有类似问题的地方的链接都会很棒。感谢。
答案 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