December 29, 2005 at 9:22 am
In this system an invoice can have multiple comments attached to it. I need to concatenate one or more comments into a single string.
The following procedural-like code works by stepping thru the row ids. Isn't there a more SQL-like way to get the desired result?
CREATE TABLE #TEMP1 (
C1 int NOT NULL,
C2 char(1) NOT NULL,
ROWID int IDENTITY (1,1) NOT NULL)
INSERT #TEMP1 VALUES (1,'A')
INSERT #TEMP1 VALUES (1,'A')
INSERT #TEMP1 VALUES (1,'B')
INSERT #TEMP1 VALUES (1,'C')
INSERT #TEMP1 VALUES (2,'A')
INSERT #TEMP1 VALUES (2,'D')
INSERT #TEMP1 VALUES (2,'E')
/* DESIRED OUTPUT, CONCATENATE COLUMN C2 FOR EACH C1
C1RESULT
1AABC
2ADE
*/
DECLARE @MAXC1 int, @CURRC1 int,@MAXID int, @CURRID int, @RESULT char(10)
SET NOCOUNT ON
/* Find the maximum and mininum values for column C1 */
SELECT @MAXC1 = MAX(C1),
@CURRC1 = MIN(C1)
FROM #TEMP1
/* Process each value in column C1 */
WHILE @CURRC1 <= @MAXC1
BEGIN
SELECT @RESULT = ''
/* Find the maximum and minimum ROWID for the current C1 value */
SELECT @MAXID = MAX(ROWID),
@CURRID = MIN(ROWID)
FROM #TEMP1
WHERE C1 = @CURRC1
/* Concatenate each C2 for the current C1 value */
WHILE @CURRID <= @MAXID
BEGIN
SELECT @RESULT = RTRIM(@RESULT) + C2
FROM #TEMP1
WHERE ROWID = @CURRID
/* Find the next ROWID to process */
SELECT @CURRID = MIN(ROWID)
FROM #TEMP1
WHERE C1 = @CURRC1
AND ROWID > @CURRID
END/* WHILE @CURRID <= @MAXID *//* Display the result */
SELECT C1 = @CURRC1,RESULT = @RESULT
/* Find the next C1 value to process */
SELECT @CURRC1 = MIN(C1)
FROM #TEMP1
WHERE C1 > @CURRC1
END/* WHILE @CURRC1 <= @MAXC1 */SET NOCOUNT OFF
OUTPUT FOR THIS CODE
C1 RESULT
----------- ----------
1 AABC
C1 RESULT
----------- ----------
2 ADE
December 29, 2005 at 9:55 am
SET NOCOUNT ON
CREATE TABLE #TEMP1 (
C1 int NOT NULL,
C2 char(1) NOT NULL,
ROWID int IDENTITY (1,1) NOT NULL)
INSERT #TEMP1 VALUES (1,'A')
INSERT #TEMP1 VALUES (1,'A')
INSERT #TEMP1 VALUES (1,'B')
INSERT #TEMP1 VALUES (1,'C')
INSERT #TEMP1 VALUES (2,'A')
INSERT #TEMP1 VALUES (2,'D')
INSERT #TEMP1 VALUES (2,'E')
declare @comments varchar(500)
(edited to remove space between comments)
select @comments = isnull(@comments, '') + c2
from #TEMP1
Where c1 = 2
select @comments
drop table #temp1
--------
ADE
Hope that helps,
ron
December 29, 2005 at 11:00 am
Thanks, Ron. I can use your code to eliminate one of my WHILE loops.
December 29, 2005 at 11:46 am
Clyde,
I think you can get rid of ALL your loops by simply enclosing Ron's logic in a UDF
create function dbo.concatComments( @id int)
returns varchar(500)
as
begin
declare @comments varchar(500)
select @comments = isnull(@comments, '') + Comment
from YourTable
Where id = @id
return @comments
end
-- and then simply
select id, dbo.concatComments( id )
from YourTable
group by id
Cheers,
* Noel
Viewing 4 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy