I have a table like this.
OrderId
QueueId
Template
Subject
RecdDtim
SentDtim
1
1
TEM1
Sub1
1
2
TEM3
Sub2
2
3
TEM1
Sub2
1
4
TEM2
Sub3
2
5
TEM3
Sub3
I want to concatenate Template, Subject and SentDtim column values for each order and display results like this:
OrderId
1
TEM1,Sub1,
2
TEM1,Sub2,
Please help me how to write the sql query to insert the results in the above format into a temporary table so that I can join that temp table with another tableon orderid column.
Anyway, if you are using SQL Server 2005, you can use basically the same solution as I provided fpr the question in http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=124926&SiteID=1:
create table why (OrderId int, QueueId int, Template nvarchar(10),
Subject nvarchar(10), RecdDtim datetime, SentDtim datetime)
go
insert into why
select 1, 1, N'TEM1', N'Sub1', '11/3/2005 8:10:10', '11/3/2005 9:00:15'
union
select 1,2, N'TEM3', N'Sub2', '11/3/2005 10:25:45', '11/3/2005 10:40:35'
union
select 2,3, N'TEM1', N'Sub2', '11/3/2005 11:45:35', '11/3/2005 12:00:00'
union
select 1, 4, N'TEM2', N'Sub3', '11/4/2005 10:25:00', '11/4/2005 10:30:00'
union
select 2, 5, N'TEM3', N'Sub3', '11/4/2005 11:56:00', '11/4/2005 12:00:00'
select o.OrderId,
substring(
(select '|', substring(
(select ',', i.Template as "text()", ',', i.Subject as "text()",
',', CONVERT(nvarchar(10), RecdDtim, 1)
from why ii
where ii.QueueId = i.QueueId and ii.OrderId = i.OrderId
for xml path('')),2, 8000)
from why i
where i.OrderId = o.OrderId
for xml path('')),2,8000)
from why o
group by o.OrderId
Best regards
Michael
Joyce
CREATE TABLE #T (OrderId int not null, EmailString varchar(1000) not null)
DECLARE @.OrderId int, @.EmailString varchar(1000)
,@.OldOrderId int, @.FirstString varchar(1000)
SET @.OldOrderId = -999
SET @.OrderId = 0
SET @.EmailString = ''
SET @.FirstString = ''
DECLARE RowCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR
SELECT
OrderId
,i.Template + ','+ i.Subject + ',' + CONVERT(varchar(10), RecdDtim, 1)
FROM why i
ORDER BY OrderId, Queueid
OPEN RowCursor
FETCH NEXT FROM RowCursor INTO @.OrderId, @.FirstString
WHILE (@.@.FETCH_STATUS = 0)
BEGIN
-- select @.oldorderid, @.orderid -- some debug code
IF @.OldOrderId = -999 SET @.OldOrderId = @.OrderId -- for first time through
IF @.OldOrderId <> @.OrderId
BEGIN
INSERT INTO #t (OrderId, EmailString) VALUES (@.OldOrderId, @.EmailString)
SET @.OldOrderId = @.OrderId
SET @.EmailString= ''
END
-- for the next QueueId within the same OrderId, concatenate a vertical bar between strings
SET @.EmailString = CASE WHEN @.EmailString = ''
THEN @.FirstString
ELSE @.EmailString + '|' + @.FirstString
END
FETCH NEXT FROM RowCursor INTO @.OrderId, @.FirstString
END
-- The last row was fetched so insert the OrderId
INSERT INTO #t (OrderId, EmailString) VALUES (@.OldOrderId, @.EmailString)
CLOSE RowCursor
DEALLOCATE RowCursor
-- See what is in there
select * from #t order by orderid
No comments:
Post a Comment