Logo

SQL Server MTRIU Function

Updated 2023-10-17 14:41:18.787000

Description

Use the scalar function MTRIU to return the upper triangular part of the string representation of a matrix.

MTRIU expects a string representation of the matrix, with columns separated by commas and rows separated by semi-colons.

Syntax

SELECT [westclintech].[wct].[MTRIU](
   <@Matrix, nvarchar(max),>)

Arguments

@Matrix

a string representation of a matrix.

Return Type

nvarchar(max)

Remarks

The string representations of @Matrix must only contain numbers, commas (to separate the columns), and semi-colons to separate the rows.

Consecutive commas will generate an error.

Consecutive semi-colons will generate an error.

Non-numeric data between commas will generate an error

Non-number data between semi-colons will generate an error

To convert non-normalized data to a string format, use the Matrix2String or the Matrix2String_q function.

To convert normalized data to a string format, use the NMatrix2String or the NMatrix2String_q function.

Examples

Let's assume that we had the following matrix, A, and we want to return the upper triangular part.

A = [-79,-45,9,9,-91,-5;68,46,9,81,-61,35;83,-25,80,-67,-22,-38;77,40,-24,69,73,-20;-17,-72,-9,-72,-6,-34;64,-47,48,-54,18,11;-4,-36,7,-56,-34,-3;-41,90,78,-43,38,64;-60,-85,-31,-83,-96,-36;-40,31,-93,-62,64,10]

We could enter the following SQL to perform the calculation.

DECLARE @A as varchar(max);
SET @A
    = '-79,-45,9,9,-91,-5;68,46,9,81,-61,35;83,-25,80,-67,-22,-38;77,40,-24,69,73,
              -20;-17,-72,-9,-72,-6,-34;64,-47,48,-54,18,11;-4,-36,7,-56,-34,-3;
              -41,90,78,-43,38,64;-60,-85,-31,-83,-96,-36;-40,31,-93,-62,64,10';
SELECT wct.MTRIU(@A) as [U];

This produces the following result.

U
-79,-45,9,9,-91,-5;0,46,9,81,-61,35;0,0,80,-67,-22,-38;0,0,0,69,73,-20;0,0,0,0,-6,-34;0,0,0,0,0,11;0,0,0,0,0,0;0,0,0,0,0,0;0,0,0,0,0,0;0,0,0,0,0,0

Of course, this is a little hard to read. Since the result is a string, we can reformat the solution to make it easier to read. Simply by changing the SELECT statement:

SELECT item as [U]
FROM wct.SPLIT(wct.MTRIU(@A), ';') l;

This produces the following result:

U
-79,-45,9,9,-91,-5
0,46,9,81,-61,35
0,0,80,-67,-22,-38
0,0,0,69,73,-20
0,0,0,0,-6,-34
0,0,0,0,0,11
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0

Which is a little bit easier to follow

However, we can use the table-valued function MATRIX, to format the result in third-normal form where it is even easier to see the output.

SELECT *
FROM wct.MATRIX(wct.MTRIU(@A)) l;

This produces the following result.

RowNumColNumItemValue
00-79
01-45
029
039
04-91
05-5
100
1146
129
1381
14-61
1535
200
210
2280
23-67
24-22
25-38
300
310
320
3369
3473
35-20
400
410
420
430
44-6
45-34
500
510
520
530
540
5511
600
610
620
630
640
650
700
710
720
730
740
750
800
810
820
830
840
850
900
910
920
930
940
950

And, if we wanted to see the result in a row/column presentation, we could use the following SQL.

SELECT [0],
       [1],
       [2],
       [3],
       [4],
       [5]
FROM
(SELECT * FROM wct.MATRIX(wct.MTRIU(@A)) ) M
PIVOT
(
    MAX(ItemValue)
    FOR colnum IN ([0], [1], [2], [3], [4], [5])
) AS pvt
ORDER BY rownum;

This produces the following result.

012345
-79-4599-91-5
046981-6135
0080-67-22-38
0006973-20
0000-6-34
0000011
000000
000000
000000
000000

In this example, we insert the matrix values into a table, #m, which is in ‘spreadsheet' format, and we use the MATRIX2SRTING function to convert the table values into a string format to be used by the MTRIU function.

SELECT *
INTO #m
FROM (
      SELECT -79,-45, 9, 9,-91, -5 UNION ALL
      SELECT 68, 46, 9, 81,-61, 35 UNION ALL
      SELECT 83,-25, 80,-67,-22,-38 UNION ALL
      SELECT 77, 40,-24, 69, 73,-20 UNION ALL
      SELECT -17,-72, -9,-72, -6,-34 UNION ALL
      SELECT 64,-47, 48,-54, 18, 11 UNION ALL
      SELECT -4,-36, 7,-56,-34, -3 UNION ALL
      SELECT -41, 90, 78,-43, 38, 64 UNION ALL
      SELECT -60,-85,-31,-83,-96,-36 UNION ALL
      SELECT -40, 31,-93,-62, 64, 10
      ) n(x0,x1,x2,x3,x4,x5);
 
SELECT [0],[1],[2],[3],[4],[5]
FROM (
      SELECT *
      FROM wct.MATRIX(wct.MTRIU(wct.MATRIX2STRING('#m','*','',NULL)))
) M PIVOT(
    MAX(ItemValue)
    FOR colnum IN([0],[1],[2],[3],[4],[5])
) AS pvt
ORDER BY rownum;

This produces the following result.

012345
-79-4599-91-5
046981-6135
0080-67-22-38
0006973-20
0000-6-34
0000011
000000
000000
000000
000000