簡體   English   中英

在 t-sql 中格式化查詢結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM