Solved

Combine data from many rows into single row

Posted on 2012-04-12
4
419 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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

When you hear the word proxy, you may become apprehensive. This article will help you to understand Proxy and when it is useful. Let's talk Proxy for SQL Server. (Not in terms of Internet access.) Typically, you'll run into this type of problem w…
International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Via a live example, show how to setup several different housekeeping processes for a SQL Server.

726 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