【问题标题】:SQL STUFF function roll up multiple rowsSQL STUFF 函数汇总多行
【发布时间】:2017-07-19 17:58:29
【问题描述】:

我正在尝试在同一天进行条目时合并一个字段。用户可以在同一天为给定的源多次输入消息。结果表如下 -

我想做的是在同一天将MessageTextSourceID 组合在一起。

我有它,它将在同一天为SourceID 创建一个记录,但是无论日期是什么,它都会为该SourceID 放置每个MessageText。它确实为同一天提供一排。例如,SourceID 在 2012 年 11 月 8 日有 2 个条目,在 2017 年 7 月 11 日有 1 个条目。它为 2012-11-08 创建一行,为 2017-07-11 创建一个行,但是它将所有 3 个 MessageText 放在行中。

我的代码是 -

SELECT distinct  s.SourceID, stuff ( (select ', ' + rtrim(x.MessageText)
                                            from [AVData].[dbo].[LogCentralMessageData] x
                                            inner join AVData.[dbo].[Source] a on a.SourceID = t.SourceID
                                            inner join(select distinct max(m.CreatedOn)over (partition by r.SourceSiteID, Convert(date, m.CreatedOn)) as maxDate, r.SourceSiteID
                                                from [AVData].[dbo].[LogCentralMessageData] m 
                                                left join AVData.[dbo].[Source] r on r.SourceID = m.SourceID
                                                )  t on t.SourceSiteID = a.SourceSiteID and convert(date, t.maxDate) = Convert(date, x.CreatedOn)

                                            where x.SourceID = a.SourceID  

                                            for XML path('')), 1, 1, '') message_text
        ,convert(date, t.CreatedOn) as CreatedDate


from [AVData].[dbo].[LogCentralMessageData] t

left join AVData.[dbo].[Source] s on s.SourceID = t.SourceID
order by SourceID, CreatedDate

【问题讨论】:

    标签: sql-server tsql string-aggregation


    【解决方案1】:

    以下应该可以解决问题...

    SELECT 
        st1.SourceID,
        CAST(st1.CreatedOn AS DATE)
        message_text = STUFF(
                    (SELECT 
                        CONCAT(', ', st2.MessageText)
                    FROM 
                        dbo.SomeTable st2
                    WHERE 
                        st1.SourceID = st2.SourceID
                        AND CAST(st1.CreatedOn AS DATE) = CAST(st2.CreatedOn AS DATE)
                    ORDER BY 
                        st2.CtreatedOn
                    FOR XML PATH ('')
                    ), 1, 2, '')
    FROM 
        dbo.SomeTable st1
    GROUP BY 
        st1.SourceID,
        CAST(st1.CreatedOn AS DATE);
    

    【讨论】:

    • 由于某种原因,它无法识别以 st1. 为前缀的任何内容,然后我得到 - 关键字 FOR 附近的语法不正确
    • 它在CAST 语句之后缺少一个“,”。当我把它放在适当的位置时,声明就奏效了。谢谢!
    【解决方案2】:

    在使用stuff() 时要记住一件事,这需要四个参数stuff(Query for xml path(''),1,1,'')。你可以像这样使用 stuff() -

    stuff((select +'/'+(CASE WHEN t2.Name IS NOT NULL THEN t2.Name ELSE (ISNULL(t2.FirstName,'') + ' ' + ISNULL(t2.LastName,'')) END)
                      from table2 t2 inner join table1 MR on t2.id = mr.id
                      where t2.ContactId = m2.contactid for xml path('')),1,1,'')
    

    【讨论】:

      【解决方案3】:
      SELECT SourceID, cast(CreatedOn as date) as CreatedDate,  message_text = STUFF(
                   (SELECT ',' + MessageText 
                    FROM yourtable t1
                    WHERE t1.id = t2.id
                    FOR XML PATH (''))
                   , 1, 1, '') from yourtable t2
      group by SourceID, cast(CreatedOn as date);
      

      【讨论】:

      • 我收到了和以前一样的结果。
      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多