【问题标题】:How to make a line break in a stuff function when using DISTINCT使用 DISTINCT 时如何在填充函数中换行
【发布时间】:2022-01-17 10:12:46
【问题描述】:

我有一个连接多条记录的 stuff 函数,我在每第二条记录后放置一个换行符,它适用于这个查询:

STUFF((
    SELECT   CASE WHEN ROW_NUMBER() OVER (order by new_name) % 2 = 1 THEN CHAR(10) ELSE ',' END +   new_name
    FROM new_subcatagories
       FOR XML PATH('')), 1, 1, '')

结果是

Auditory,Kinesthetic  vestibular  
Multitasking,Planning & organization  
Proprioception,Tactile  
Vestibular tactile,Visual  

但我现在想用另一个我需要 DISTINCT 的列来做这个,但我无法让它工作我的查询是:

STUFF((
    SELECT  distinct (CASE WHEN ROW_NUMBER() OVER (order by new_maincatgoriesname) % 2 = 1 THEN CHAR(10) ELSE ',' END
    +    new_maincatgoriesname)
       FOR XML PATH('')), 1, 1, '')

我得到的结果是多种意想不到的方式,例如

Executive Function
Sensory  Discrimination
Sensory modulation ,Multitasking,Sensory  Discrimination,Sensory modulation

或其他意想不到的方式,我希望结果是

Executive Function,Sensory Discrimination          
Sensory modulation,Multitasking

如果有人可以帮助我,将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    DISTINCT 适用于整行,因此使用不需要的数据填充额外的列(例如 ROW_NUMBER())会产生无效结果。

    要修复它,您需要添加另一个查询嵌套级别。

    DECLARE @Blah TABLE( new_maincatgoriesname VARCHAR( 200 ))
    INSERT INTO @Blah
    VALUES( 'Executive Function' ), ( 'Sensory Discrimination' ), ( 'Multitasking' ),
        ( 'Sensory Discrimination' ), ( 'Executive Function' ), ( 'Sensory modulation' )
    
    SELECT
        STUFF( CAST((
        -- Step 2: manipulate result of Step 1
        SELECT (CASE WHEN ROW_NUMBER() OVER (order by new_maincatgoriesname) % 2 = 1 THEN CHAR(10) ELSE ',' END + new_maincatgoriesname )
        FROM
            -- Step 1: Get distinct values
            ( SELECT DISTINCT new_maincatgoriesname
            FROM @Blah ) AS MainQuery
          FOR XML PATH('') ) AS VARCHAR( 2000 )), 1, 1, '' )
    

    输出:

    Executive Function,Multitasking
    Sensory Discrimination,Sensory modulation
    

    【讨论】:

    • 非常感谢您的帮助,按预期工作
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多