【问题标题】:SQL Server : get size of longest value in column and include column name in that totalSQL Server:获取列中最长值的大小并在该总数中包含列名
【发布时间】:2018-02-02 18:27:19
【问题描述】:

我有以下查询,它返回它在该列中找到的最长单词的编号:

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。

如何将列名添加到查询中以进行计数?

【问题讨论】:

  • 您不能在应用程序级别执行此操作吗?那里似乎更简单。
  • @GordonLinoff 这样做会更容易,但在我目前的情况下,最好通过查询来完成。

标签: sql sql-server reporting-services ssrs-2016


【解决方案1】:

您可以使用UNPIVOTPIVOT

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

【讨论】:

  • 我收到此错误:“linkToTbl2”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。
  • 所有列的类型应该相同。我更新了
  • 啊,做到了。感谢您的帮助,Serkan!
  • 我想知道你为什么需要这个并且原始查询不起作用?
  • @JuanCarlosOropeza 它确实有效,但不考虑计数中的列名。
【解决方案2】:

如果你的列都是字符串,你可以使用相当蛮力:

select . . .
from ((select id, linkToTbl2, . . . from bLine) union all
      (select 'id', 'linkToTbl2', . . .)
     ) b;

无论您在 SQL 中采用什么方法,都需要列出所有列名。我认为这最好在应用层完成。

【讨论】:

  • 我得到使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式。
  • @StealthRT。 . .然后明确列出列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2011-01-07
  • 2019-07-13
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多