【问题标题】:Problem in T-sqlT-sql 中的问题
【发布时间】:2011-07-07 17:38:00
【问题描述】:

我有一个名为 results 的表,数据如下:

Response_ID  order    [part label]             [Answer text]     [Answer label]
124587       6        It was not clear         NULL               Yes
124587       6        Did not Understand      Null                Yes
124589       6        Other (Please specify):  Not enough         Yes 
124563       1        NULL                     Satisfied?         Yes
124583       11       Not frequent             NULL               Yes  
125687       2        NULL                     Resolved?          NO

我希望输出为:

Response_ID           [Part label]
124587                It was not clear,Did not Understand 
124589                Not enough         
124563                Yes
124583                Not frequent
125687                NO

逻辑是每当 Order 为 6 或 11 时,如果 [Part Label] 对一个 Response_ID 有多个值,则我需要显示 [Part Label],然后我需要将它们连接起来,但当 [Part Label] 的值为其他(请指定):那么我需要使用来自答案文本列的值,如果订单不在 6,11 中,那么我需要显示来自答案标签的值

【问题讨论】:

标签: sql sql-server sql-server-2005 tsql sql-server-2008


【解决方案1】:

我没有看到关于订单的部分。我希望它现在可以工作。

DECLARE @t TABLE (Response_ID INT,[order] INT, [part label] VARCHAR(25), [Answer text] VARCHAR(15), [Answer label] VARCHAR(3))

INSERT @t VALUES (124587,6 , 'It was not clear'       , NULL        , 'Yes')
INSERT @t VALUES (124587,6 , 'Did not Understand'    , Null        , 'Yes' )
INSERT @t VALUES (124589,6 , 'Other (Please specify):','Not enough' , 'Yes')
INSERT @t VALUES (124563,1 , NULL                     ,'Satisfied?' , 'Yes')
INSERT @t VALUES (124583,11, 'Not frequent'           , NULL        , 'Yes') 
INSERT @t VALUES (125687,2 , NULL                     ,'Resolved?'  , 'NO' )

SET ARITHABORT ON

;WITH x AS   ( 
SELECT CASE WHEN [order] = 11 THEN 6 ELSE [order] END [order], response_id, COALESCE(CASE WHEN [part label] = 'Other (Please specify):' THEN [Answer text] ELSE [part label] end ,[Answer label]) [Part label] 
FROM @t
) 
SELECT response_id, STUFF(( 
        SELECT ',' + [Part label] 
        FROM x t1 
        WHERE t1.response_id = x.response_id and t1.[order] = x.[order]
        for xml path(''), type 
    ).value('.', 'varchar(max)'), 1, 1, '') [Part label] FROM x
GROUP BY response_id, [order]

结果:

response_id Part label
----------- -------------------------------------
124563      Yes
124583      Not frequent
124587      It was not clear,Did not Undersstand
124589      Not enough
125687      NO

【讨论】:

  • @t-clause 上面的示例数据可以正常工作,但是如果一个reponse_ID 有不同的订单值就会失败
  • 我尝试调整我的脚本以适用于不同的订单集
【解决方案2】:

这曾经是通过涉及 ISNULL() 的鲜为人知的角度来实现的。这些天来,人们用“FOR XML PATH”来做这件事。请注意,这不受支持,但它现在可以为您工作。

Concatenating Row Values in T-SQL

【讨论】:

    【解决方案3】:

    太糟糕了,没有简单的解决方案,因为 Sql Server 无法连接结果集行。看看这些问题:

    Concatenate many rows into a single text string?

    How to create a SQL Server function to "join" multiple rows from a subquery into a single delimited field?

    【讨论】:

    • 虽然我是在我的脚本中做到的
    【解决方案4】:

    查看以下文章的“黑盒 XML 方法”部分。我相信它会满足您的需求。

    https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 2011-08-26
      • 1970-01-01
      • 2011-11-23
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多