代码之家  ›  专栏  ›  技术社区  ›  StealthRT

SQL Server:获取列中最长值的大小,并将列名包含在总数中

  •  3
  • StealthRT  · 技术社区  · 7 年前

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

    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)。 链接ToTBL2 应该是10(linkToTbl2),所以应该是10,而不是3。

    如何将列名添加到查询中以计算其数量?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Serkan Arslan    7 年前

    您可以使用 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
    
        2
  •  0
  •   Gordon Linoff    7 年前

    如果列都是字符串,则可以使用蛮力:

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

    在SQL中采取的任何方法都需要列出所有列名。我认为这最好在应用层完成。