I have a table 2 columns (Object and Weight) with data like below:
Object Weight(lb)
table 5
Chair 6
Computer 3
Computer 5
TV 20
TV 15
Radio 10
Computer 10
Question: I would like to create a new table with one column that would join the above two columns like below
Object
table 5
Chair 6
Computer 3, 5, 10
TV 20, 15
Radio 10
Thanks for your help in advance.
SELECT t3.Object, MAX(case t3.seq when 1 then t3.Weight end)
+ MAX(case t3.seq when 2 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 3 then ', ' + t3.Weight else '' end) AS Weight
FROM ( SELECT Object, Weight, (SELECT COUNT(*) FROM mergeTable1$ AS t2 WHERE t2.Object = t1.Object and t2.Weight <= t1.Weight) AS seq
FROM mergeTable1$ AS t1
) as t3
GROUP BY t3.Object
ORDER BY t3.Object
|||
What if I do not know the Max number of Weights for each object. eg. an object may have n number of weights in the table.
Thanks
|||I would guess a maximum possible number in this solution. For example:
SELECT t3.Object, MAX(case t3.seq when 1 then t3.Weight end)
+ MAX(case t3.seq when 2 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 3 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 4 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 5 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 6 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 7 then ', ' + t3.Weight else '' end)
+ MAX(case t3.seq when 8 then ', ' + t3.Weight else '' end) AS Weight
FROM ( SELECT Object, Weight, (SELECT COUNT(*) FROM mergeTable1$ AS t2 WHERE t2.Object = t1.Object and t2.Weight <= t1.Weight) AS seq
FROM mergeTable1$ AS t1
) as t3
GROUP BY t3.Object
ORDER BY t3.Object
By the way, are you using SQL Server 2005? There are other solutions to handle this one.
|||Yes, I am using sql server 2005
Thanks
|||In SQL 2005, you can try like this
Create table tbl(Object varchar(100), Weight int)
insert tbl
Select 'table', 5 union all
Select 'Chair', 6 union all
Select 'Computer', 3 union all
Select 'Computer', 5 union all
Select 'TV' , 20 union all
Select 'TV' , 15 union all
Select 'Radio' , 10 union all
Select 'Computer' ,10
with CTE (Object,Weight1) as
(
select Object,Weight1=cast(Weight as varchar(50)) from tbl
union all
select a.Object,Weight1=convert(varchar(24),Weight1)+','+convert(varchar(25),a.Weight)
from tbl a inner loop join CTE b
on a.Object=b.Object and patindex('%'+convert(varchar(50),a.Weight)+'%',Weight1)<1
)
select distinct Object, max(Weight1) from CTE
Group by Object
|||--We can use CTE in SQL Server 2005. The recursive function will take care of the number of records for the same object in your table.
With MyCTE(Object, Weight, Weights, myNum) AS
(SELECT a.Object, CONVERT(varchar(50), MIN(a.Weight)) as col1, CONVERT(varchar(50),(a.Weight)) as Weights, 1 as myNum
FROM mergeTable1$ a GROUP BY a.Object, CONVERT(varchar(50),(a.Weight))
UNION ALL
SELECT b.Object, CONVERT(varchar(50), b.Weight), CONVERT(varchar(50), (c.Weights + ',' + b.Weight)), c.myNum+1 as myNum
FROM mergeTable1$ b INNER JOIN MyCTE c ON b.Object=c.Object
WHERE b.Weight>c.Weight
)
SELECT a.Object, Weights FROM MyCTE a INNER JOIN (SELECT Max(a1.myNum) as myNumMax, a1.Object FROM MyCTE a1
group by a1.Object) b on a.Object=b.Object AND a.myNum= b.myNumMax ORDER BY a.Object
|||Yet another way to do it, using data from one of the other posts, and the 2005 techniques from:
http://databases.aspfaq.com/general/how-do-i-concatenate-strings-from-a-column-into-a-single-row.html
Create table tbl(Object varchar(100), Weight int)
insert tbl
Select 'table', 5 union all
Select 'Chair', 6 union all
Select 'Computer', 3 union all
Select 'Computer', 5 union all
Select 'TV' , 20 union all
Select 'TV' , 15 union all
Select 'Radio' , 10 union all
Select 'Computer' ,10
SELECT
Object,
Weights = LEFT(o.list, LEN(o.list)-1)
FROM
(select distinct object from tbl) as tbl --if these values are defined in another related table it is more clear
CROSS APPLY
(
SELECT CONVERT(VARCHAR(12), Weight) + ',' AS [text()]
FROM tbl as t
WHERE t.object = tbl.object
ORDER BY weight
FOR XML PATH('')
) o (list)
For some ideas, see:
http://www.projectdmx.com/tsql/rowconcatenate.aspx
--
Anith
|||i belive this can help
well use this function to get retrive the string that cotaians the rows of the specific ID.
CREATE FUNCTION dbo.ConRow(@.JID int)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @.Output VARCHAR(8000)
SELECT @.Output = COALESCE(@.Output+', ', '') + CONVERT(varchar(20), JP.a)
FROM [E_JobPending] JP
WHERE JP.JobID = @.JID
RETURN @.Output
END
select dbo.ConRow(jobid), vE_Job.*
from
vE_Job
DROP FUNCTION dbo.ConRow
No comments:
Post a Comment