[英]Formatting query results in t-sql
這是我當前的代碼,它從給定數字開始生成 2 個乘法表:
CREATE
OR
ALTER PROCEDURE dbo.math_tables (@x INT = 1)
AS
BEGIN
DECLARE @y INT = 1
DECLARE @ctr INT = 0
BEGIN
WHILE @ctr <= 2
BEGIN
WHILE @y <= 10
BEGIN
PRINT ltrim(str(@x)) + ' x ' + ltrim(str(@y)) + ' = ' + ltrim(str(@x * @y))
SET @y += 1
END
SET @x += 1
SET @y = 1
SET @ctr += 1
PRINT '---------------------------'
END
END
END
GO
EXECUTE dbo.math_tables 5 /* Starting table */
GO
結果目前看起來像這樣一個接一個:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
---------------------------
6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54
6 x 10 = 60
---------------------------
但我希望它看起來像這樣。 基本上,每當@ctr 上升一個時,我都會嘗試從一個新專欄開始:
5 x 1 = 5 6 x 1 = 6
5 x 2 = 10 6 x 2 = 12
5 x 3 = 15 6 x 3 = 18
5 x 4 = 20 6 x 4 = 24
5 x 5 = 25 6 x 5 = 30
5 x 6 = 30 6 x 6 = 36
5 x 7 = 35 6 x 7 = 42
5 x 8 = 40 6 x 8 = 48
5 x 9 = 45 6 x 9 = 54
5 x 10 = 50 6 x 10 = 60
請不要問為什么......我正在嘗試學習查詢結果格式以提高可讀性;D
根據您的要求,您需要 go 和臨時/物理表。 選擇任何你能選擇的。 否則你需要根據你的結果集編寫一些字符串操作操作。
我已經根據我的理解修改了查詢。 並確認我要使用表格方法。
DECLARE @x INT = 5
DECLARE @y INT = 1
DECLARE @ctr INT = 0
DECLARE @Value NVARCHAR(200)
DECLARE @SQL NVARCHAR(MAX)
CREATE Table #Matrix
(
Id INT IDENTITY(1,1)
)
BEGIN
WHILE @ctr <= 2
BEGIN
EXEC('ALTER TABLE #Matrix ADD COL_'+@ctr+' NVARCHAR(200)')
WHILE @y <= 10
BEGIN
SET @Value = ltrim(str(@x)) + ' x ' + ltrim(str(@y)) + ' = ' + ltrim(str(@x * @y))
IF(@ctr>0)
BEGIN
SET @SQL = CONCAT('UPDATE #Matrix SET [COL_',CAST(@ctr AS NVARCHAR),']=''',@Value,''' WHERE Id = ',@y)
END
ELSE
BEGIN
SET @SQL = CONCAT('INSERT INTO #Matrix([COL_',CAST(@ctr AS NVARCHAR),']) VALUES(''',@Value,''')')
END
EXEC(@SQL)
SET @y += 1
END
SET @x += 1
SET @y = 1
SET @ctr += 1
END
END
SELECT * FROM #Matrix
DROP TABLE #Matrix
Output
在查詢中,我添加了一個表,即#Matrix
在表中,我們在循環執行時添加了一次列。
將列添加到表后,我們將數據插入/更新到表中。
正如@Lamu 所建議的,這是一種無需循環或遞歸的方法。 在 2022 年,您可以將“Tally”cte 替換為 GENERATE_SERIES(),或者,如果有的話,您可以使用數字/Tally 表或基於 function 的集合,例如 Itzik Ben-Gan 的“GetNums”function 或我的“fnTally”function .
並且,一點integer除法和Modulo做數據的“定位”。 請記住,模數返回除法的“余數”,當被除數和除數都是整數時,商和余數也將是整數。
WITH
cteTally AS
(--==== Generate a psuedo Tally Table from 1 to 11.
-- We'll have a separating bar show up at 11.
SELECT TOP (11)
N = ROW_NUMBER() OVER (ORDER BY @@SPID) --Used for both the Multiplicand and Multiplier
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2
)
,cteMultiply AS
(--==== Create the display value for each product combination and a row# to derive Grp, Col, and Row from.
-- The CROSS JOIN is also known as a "Cartesian Product" or "Square Join", like a times table.
SELECT RowNum = ROW_NUMBER() OVER (ORDER BY t1.N,t2.N)-1
,DisplayValue = CONCAT(CONVERT(CHAR(3),t1.N),'x ',CONVERT(CHAR(3),t2.N),'= ',t1.N*t2.N)
FROM cteTally t1 --Multiplicand
CROSS JOIN cteTally t2 --Multiplier
)--==== This is what is known as a "CROSSTAB".
SELECT Col1 = MAX(CASE
WHEN Row = 10 THEN REPLICATE('-',13)
WHEN Col = 0 THEN DisplayValue
END)
,Col2 = MAX(CASE
WHEN Row = 10 THEN REPLICATE('-',13)
WHEN Col = 1 THEN DisplayValue
END)
FROM cteMultiply m
CROSS APPLY (VALUES(RowNum/22, RowNum/11%2,RowNum%11))ca(Grp,Col,Row) --"DRY" it out.
WHERE RowNum < 110
GROUP BY ca.Grp, ca.Row
ORDER BY ca.Grp, ca.Row
;
做整個 10*10 的事情讓我有點忘乎所以。 代碼應該很容易修改以適應。 這是結果集......
Col1 Col2
1 x 1 = 1 2 x 1 = 2
1 x 2 = 2 2 x 2 = 4
1 x 3 = 3 2 x 3 = 6
1 x 4 = 4 2 x 4 = 8
1 x 5 = 5 2 x 5 = 10
1 x 6 = 6 2 x 6 = 12
1 x 7 = 7 2 x 7 = 14
1 x 8 = 8 2 x 8 = 16
1 x 9 = 9 2 x 9 = 18
1 x 10 = 10 2 x 10 = 20
------------- -------------
3 x 1 = 3 4 x 1 = 4
3 x 2 = 6 4 x 2 = 8
3 x 3 = 9 4 x 3 = 12
3 x 4 = 12 4 x 4 = 16
3 x 5 = 15 4 x 5 = 20
3 x 6 = 18 4 x 6 = 24
3 x 7 = 21 4 x 7 = 28
3 x 8 = 24 4 x 8 = 32
3 x 9 = 27 4 x 9 = 36
3 x 10 = 30 4 x 10 = 40
------------- -------------
5 x 1 = 5 6 x 1 = 6
5 x 2 = 10 6 x 2 = 12
5 x 3 = 15 6 x 3 = 18
5 x 4 = 20 6 x 4 = 24
5 x 5 = 25 6 x 5 = 30
5 x 6 = 30 6 x 6 = 36
5 x 7 = 35 6 x 7 = 42
5 x 8 = 40 6 x 8 = 48
5 x 9 = 45 6 x 9 = 54
5 x 10 = 50 6 x 10 = 60
------------- -------------
7 x 1 = 7 8 x 1 = 8
7 x 2 = 14 8 x 2 = 16
7 x 3 = 21 8 x 3 = 24
7 x 4 = 28 8 x 4 = 32
7 x 5 = 35 8 x 5 = 40
7 x 6 = 42 8 x 6 = 48
7 x 7 = 49 8 x 7 = 56
7 x 8 = 56 8 x 8 = 64
7 x 9 = 63 8 x 9 = 72
7 x 10 = 70 8 x 10 = 80
------------- -------------
9 x 1 = 9 10 x 1 = 10
9 x 2 = 18 10 x 2 = 20
9 x 3 = 27 10 x 3 = 30
9 x 4 = 36 10 x 4 = 40
9 x 5 = 45 10 x 5 = 50
9 x 6 = 54 10 x 6 = 60
9 x 7 = 63 10 x 7 = 70
9 x 8 = 72 10 x 8 = 80
9 x 9 = 81 10 x 9 = 90
9 x 10 = 90 10 x 10 = 100
------------- -------------
如果你可以在沒有破折號的情況下生活,那就更容易了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.