SQL 服务器:获取列中最长值的大小,并将列名包含在该总数中
SQL Server : get size of longest value in column and include column name in that total
我有以下查询,returns 它在该列中找到的最长单词的数量:
SELECT
MAX(LEN(id)) AS id,
MAX(LEN(linkToTbl2)) AS linkToTbl2,
MAX(LEN(description)) AS description,
MAX(LEN(number)) AS number,
MAX(LEN(line)) AS line,
MAX(LEN(network)) AS network,
MAX(LEN(type)) AS type,
MAX(LEN(IPhase)) AS IPhase,
MAX(LEN(environment)) AS environment,
MAX(LEN(sType)) AS sType,
MAX(LEN(bDescription)) AS bDescription
FROM
bLine
但是,如果所述列比该列的标题小,则在计算最大值时不会考虑这一点。
示例(我想要做什么):
|id | linkToTbl2 | description |
+---+------------+-------------------------+
|14 |hi |This is just a demo. |
|16 |baa |Another description here.|
在示例查询中看起来像这样:
|id |linkToTbl2 |description |
+---+-----------+------------+
|2 |10 |25 |
现在这是我的 SSRS 报告中目前的样子:
|id |lin|description |
| |kTo| |
| |tbl| |
| |2 | |
|---|---|-------------------------|
|14 |hi |This is just a demo. |
|16 |baa|Another description here.|
这在查询中看起来像这样:
|id |linkToTbl2 |description |
|---|-----------|------------|
|2 |3 |25 |
请注意 linkToTbl2
字段是如何 压缩的 ,因为该列中的最长值为 3 (baa)。 linkToTbl2
将是 10 (linkToTbl2) 所以它应该是 10 而不是 3。
如何将列名称添加到查询中以将其也计算在内?
如果你的列都是字符串,你可以使用蛮力:
select . . .
from ((select id, linkToTbl2, . . . from bLine) union all
(select 'id', 'linkToTbl2', . . .)
) b;
无论您在 SQL 中采用何种方法,都需要列出所有列名。我觉得这个在应用层做比较好
您可以使用 UNPIVOT
和 PIVOT
DECLARE @MyTable TABLE (id INT, linkToTbl2 VARCHAR(100), description VARCHAR(100))
INSERT INTO @MyTable VALUES
(14,'hi','This is just a demo.'),
(16,'baa','Another description here.')
SELECT * FROM
( SELECT
Col,
MAX(CASE WHEN LEN(Val) > LEN(Col) THEN LEN(Val) ELSE LEN(Col) END) LEN_OF_COL
FROM
( SELECT
CONVERT(VARCHAR(MAX),[Id]) [Id],
CONVERT(VARCHAR(MAX),[linkToTbl2]) [linkToTbl2],
CONVERT(VARCHAR(MAX),[description]) [description]
FROM @MyTable ) SRC
UNPIVOT (Val FOR Col IN( [Id], [linkToTbl2], [description] ) ) UNPVT
GROUP BY Col ) T
PIVOT( MAX(LEN_OF_COL) FOR Col IN ( [Id], [linkToTbl2], [description] ) ) PVT
结果:
Id linkToTbl2 description
----------- ----------- -----------
2 10 25
我有以下查询,returns 它在该列中找到的最长单词的数量:
SELECT
MAX(LEN(id)) AS id,
MAX(LEN(linkToTbl2)) AS linkToTbl2,
MAX(LEN(description)) AS description,
MAX(LEN(number)) AS number,
MAX(LEN(line)) AS line,
MAX(LEN(network)) AS network,
MAX(LEN(type)) AS type,
MAX(LEN(IPhase)) AS IPhase,
MAX(LEN(environment)) AS environment,
MAX(LEN(sType)) AS sType,
MAX(LEN(bDescription)) AS bDescription
FROM
bLine
但是,如果所述列比该列的标题小,则在计算最大值时不会考虑这一点。
示例(我想要做什么):
|id | linkToTbl2 | description |
+---+------------+-------------------------+
|14 |hi |This is just a demo. |
|16 |baa |Another description here.|
在示例查询中看起来像这样:
|id |linkToTbl2 |description |
+---+-----------+------------+
|2 |10 |25 |
现在这是我的 SSRS 报告中目前的样子:
|id |lin|description |
| |kTo| |
| |tbl| |
| |2 | |
|---|---|-------------------------|
|14 |hi |This is just a demo. |
|16 |baa|Another description here.|
这在查询中看起来像这样:
|id |linkToTbl2 |description |
|---|-----------|------------|
|2 |3 |25 |
请注意 linkToTbl2
字段是如何 压缩的 ,因为该列中的最长值为 3 (baa)。 linkToTbl2
将是 10 (linkToTbl2) 所以它应该是 10 而不是 3。
如何将列名称添加到查询中以将其也计算在内?
如果你的列都是字符串,你可以使用蛮力:
select . . .
from ((select id, linkToTbl2, . . . from bLine) union all
(select 'id', 'linkToTbl2', . . .)
) b;
无论您在 SQL 中采用何种方法,都需要列出所有列名。我觉得这个在应用层做比较好
您可以使用 UNPIVOT
和 PIVOT
DECLARE @MyTable TABLE (id INT, linkToTbl2 VARCHAR(100), description VARCHAR(100))
INSERT INTO @MyTable VALUES
(14,'hi','This is just a demo.'),
(16,'baa','Another description here.')
SELECT * FROM
( SELECT
Col,
MAX(CASE WHEN LEN(Val) > LEN(Col) THEN LEN(Val) ELSE LEN(Col) END) LEN_OF_COL
FROM
( SELECT
CONVERT(VARCHAR(MAX),[Id]) [Id],
CONVERT(VARCHAR(MAX),[linkToTbl2]) [linkToTbl2],
CONVERT(VARCHAR(MAX),[description]) [description]
FROM @MyTable ) SRC
UNPIVOT (Val FOR Col IN( [Id], [linkToTbl2], [description] ) ) UNPVT
GROUP BY Col ) T
PIVOT( MAX(LEN_OF_COL) FOR Col IN ( [Id], [linkToTbl2], [description] ) ) PVT
结果:
Id linkToTbl2 description
----------- ----------- -----------
2 10 25