SQL STUFF 函数汇总多行
SQL STUFF function roll up multiple rows
我想在同一天进行输入时合并一个字段。用户可以在同一天为给定的源多次输入一条消息。结果 table 如下 -
我想做的是在同一天将 MessageText
与 SourceID
组合在一起。
我有它,它将在同一天为 SourceID
创建记录,但是无论日期是什么,它都会为 SourceID
放置每个 MessageText
。它确实在同一天给出一行。例如,SourceID
在 2012-11-08 有 2 个条目,在 2017-07-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
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);
下面应该可以解决问题...
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);
在使用 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,'')
我想在同一天进行输入时合并一个字段。用户可以在同一天为给定的源多次输入一条消息。结果 table 如下 -
我想做的是在同一天将 MessageText
与 SourceID
组合在一起。
我有它,它将在同一天为 SourceID
创建记录,但是无论日期是什么,它都会为 SourceID
放置每个 MessageText
。它确实在同一天给出一行。例如,SourceID
在 2012-11-08 有 2 个条目,在 2017-07-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
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);
下面应该可以解决问题...
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);
在使用 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,'')