Solved

Combine data from many rows into single row

Posted on 2012-04-12
4
420 Views
Last Modified: 2012-06-27
I have a master table called tbl_Job in which I want to populate a 4000char string, by pulling info from the child table tbl_JobBOM.  There can be up to 99 records in tbl_JobBOM from which several columns need extracted and placed into the parent table in a single row, single column, per PK.


WITH CTE AS 
(
SELECT 
    ItemNo + ' ' +QtyRequired) + ' ' + QtyOpen +  CHAR(13) + CHAR(10) 
  AS CompDetails, 
  
  ROW_NUMBER() OVER (PARTITION BY JobOper ORDER BY ItemNo) AS Seq,
    JobOper FROM tbl_JobBOM 
)  
    
UPDATE b SET ComponentsThisOper = 
LEFT( 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=1) 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=2) 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=3) 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=4) 
--... 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=97) 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=98) 
+ (SELECT MAX(CompDetails) FROM CTE WHERE JobOper=b.JobOper AND Seq=99)
,4000) 

FROM tbl_Job b

Open in new window



The tables are large and the query takes 2 minutes to run.  I'm looking for a better way to do this, that runs much faster and doesn't require the 99 lines of select statements.

Can someone please send a working code snippet to illustrate a better approach?

 I have searched all over Google and have read about pivots, coalesce, etc but am not able to understand how to apply the concepts to this problem.

Thanks in advance
0
Comment
Question by:LovinSpoonful
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 37

Expert Comment

by:momi_sabag
ID: 37840578
try this
WITH CTE AS
(
SELECT
    ItemNo + ' ' +QtyRequired) + ' ' + QtyOpen +  CHAR(13) + CHAR(10)
  AS CompDetails,
 
  ROW_NUMBER() OVER (PARTITION BY JobOper ORDER BY ItemNo) AS Seq,
    JobOper FROM tbl_JobBOM
) ,
cte2 (CompDetails) as (
select CompDetails   from cte where seq between 1 and 99 order by seq for xml path('')
  )
UPDATE b SET ComponentsThisOper =
LEFT( CompDetails,4000)

FROM tbl_Job b
0
 

Author Comment

by:LovinSpoonful
ID: 37849766
I am not able to make this work.

Here is what I can make work:


WITH a AS (
SELECT JobOper,
       ItemNo + ' ' + CONVERT(VARCHAR,QtyRequired) + ' ' + CONVERT(VARCHAR,QtyOpen) +  CHAR(13) + CHAR(10) AS CompDetails,
       ROW_NUMBER() OVER (PARTITION BY JobOper ORDER BY ItemNo) AS Seq
FROM tbl_JobBOM
)  

SELECT CompDetails FROM a WHERE a.Seq between 1 and 99
  and JobOper = '623417.150'
ORDER BY seq FOR XML PATH('')

result:

<CompDetails>abcdef  6 0
</CompDetails>
<CompDetails>ghijklm 3 0
</CompDetails>
<CompDetails>nopqrs 3 0
</CompDetails>


I need to get the JobOper attached to each XML record, then update with a join.
I tried this but it doesn't work:


WITH a AS (
SELECT JobOper,
       ItemNo + ' ' + CONVERT(VARCHAR,QtyRequired) + ' ' + CONVERT(VARCHAR,QtyOpen) +  CHAR(13) + CHAR(10) AS CompDetails,
       ROW_NUMBER() OVER (PARTITION BY JobOper ORDER BY ItemNo) AS Seq
FROM tbl_JobBOM
)  

, b (JobOper, CompDetails) AS (SELECT JobOper, CompDetails FROM a WHERE a.Seq between 1 and 99 ORDER BY seq FOR XML PATH(''))

UPDATE j SET ComponentsThisOper = LEFT(b.CompDetails,4000)
FROM tbl_Job j
INNER JOIN b ON j.JobOper = b.JobOper
WHERE j.JobOper = b.JobOper


the error is:  
Msg 8159, Level 16, State 1, Line 9
'b' has fewer columns than were specified in the column list.
0
 

Accepted Solution

by:
LovinSpoonful earned 0 total points
ID: 38084070
The way this was eventually solved was to create an additional table to post the intermediary data into, the run a second update query.  then we deleted the temporary table.
0
 

Author Closing Comment

by:LovinSpoonful
ID: 38097725
didn't get an answer from the community
0

Featured Post

Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

JSON is being used more and more, besides XML, and you surely wanted to parse the data out into SQL instead of doing it in some Javascript. The below function in SQL Server can do the job for you, returning a quick table with the parsed data.
The Delta outage: 650 cancelled flights, more than 1200 delayed flights, thousands of frustrated customers, tens of millions of dollars in damages – plus untold reputational damage to one of the world’s most trusted airlines. All due to a catastroph…
This video shows, step by step, how to configure Oracle Heterogeneous Services via the Generic Gateway Agent in order to make a connection from an Oracle session and access a remote SQL Server database table.
Using examples as well as descriptions, and references to Books Online, show the different Recovery Models available in SQL Server and explain, as well as show how full, differential and transaction log backups are performed

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question