February 17, 2015 at 4:04 pm
Hello,
I'm hoping I can get some guidance on how to properly use the "For XML Path" code to concatenate multiple values into one record. What I have is a procedure I've written for a SSRS report that summarizes drive information: date, account, recruiter, times.
But each drive can have multiple shifts, and each shift will have it's own vehicle assigned. So a drive may have 1 vehicle assigned to it or it may have 5. If there are 5 shifts/5 vehicles, I don't want to the report to display 5 rows of data for the one drive. So I'm trying to get all of the vehicles to be placed into one field for the report.
My initial sub-query will not work because it is possible that it will contain more than one item (vehicle):
Select
DM.DriveID [DriveID],
DM.FromDateTime [FromDateTime],
DSD.ShiftID [ShiftID],
Case When DM.OpenToPublic = 1 Then 'Yes' Else 'No' End As [OpenToPublic],
Case When DM.OwnerType=0 Then 'Mobile' Else 'Fixed' End As [OwnerType],
Case When DM.OwnerType = 0 Then Acct.Name Else CD.DescLong End As [OwnerName],
-- Mobile Vehicles
(Select isnull(MSM.ShortDesc,'') From rpt_MobileSetupMaster MSM Where MobileType=1 and MobileID In
(Select MobileID From rpt_DriveShiftMobileDetail DSMD Where DSMD.ShiftID In
(Select ShiftID From rpt_DriveShiftDetail DSD Where DSD.DriveID = DM.DriveID))) [Mobile_Short_Desc]
From rpt_DriveMaster DM
Left Outer Join rpt_Accounts Acct on DM.AccountID=Acct.AccountID
Inner Join rpt_CenterDetail CD on DM.CenterID=CD.CenterID
I've read articles such as http://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/[/url] but I'm not sure how or if i can incorporate it into my sub-query to for vehicles.
Any suggestions on the best way to handle this?
And not sure if this should be in the SQL Server Newbie or here either. I'm a newbie as well.
February 18, 2015 at 10:23 am
Hi,
Try:
STUFF( (Select ', ' + isnull(MSM.ShortDesc,'')
From From rpt_DriveShiftDetail DSD
Inner Join rpt_DriveShiftMobileDetail DSMD
On DSMD.ShiftID = DSD.ShiftID
Inner Join rpt_MobileSetupMaster MSM
On MSM.MobileType = 1 and MSM.MobileID = DSMD.MobileID
Where DSD.DriveID = DM.DriveID
For XML PATH(''), TYPE).value('.', 'varchar(max)')
,1, 2, '') as [Mobile_Short_Desc]
Hope this helps.
February 18, 2015 at 12:15 pm
That actually works great, thank you very much.
One last thing, is there a way to select distinct records in this command?
For example, while a drive may have multiple shifts, a vehicle could then be assigned to multiple while I would like it to be displayed only once?
February 18, 2015 at 12:20 pm
Check out this article on the topic. http://www.sqlservercentral.com/articles/comma+separated+list/71700/[/url]
_______________________________________________________________
Need help? Help us help you.
Read the article at http://www.sqlservercentral.com/articles/Best+Practices/61537/ for best practices on asking questions.
Need to split a string? Try Jeff Modens splitter http://www.sqlservercentral.com/articles/Tally+Table/72993/.
Cross Tabs and Pivots, Part 1 – Converting Rows to Columns - http://www.sqlservercentral.com/articles/T-SQL/63681/
Cross Tabs and Pivots, Part 2 - Dynamic Cross Tabs - http://www.sqlservercentral.com/articles/Crosstab/65048/
Understanding and Using APPLY (Part 1) - http://www.sqlservercentral.com/articles/APPLY/69953/
Understanding and Using APPLY (Part 2) - http://www.sqlservercentral.com/articles/APPLY/69954/
February 18, 2015 at 12:24 pm
You can add Distinct:
STUFF( (Select Distinct ', ' + isnull(MSM.ShortDesc,'')
Hope this helps.
February 18, 2015 at 12:36 pm
Thanks again imex,
Last question I promise. Adding Distinct does work, but with or without it, I am noticing it is trimming the the first letter word/number off the Vehicle Description.
For example, all of the vehicles should begin with "M" followed by a 3 digit number. But when I run the report in SSRS or SSMS the "M" is trimmed off the first record, but if multiple vehicles are displayed, all records after the first are fine:
Is there a way around this?
February 18, 2015 at 12:46 pm
treyagrimes (2/18/2015)
Thanks again imex,Last question I promise. Adding Distinct does work, but with or without it, I am noticing it is trimming the the first letter word/number off the Vehicle Description.
For example, all of the vehicles should begin with "M" followed by a 3 digit number. But when I run the report in SSRS or SSMS the "M" is trimmed off the first record, but if multiple vehicles are displayed, all records after the first are fine:
Is there a way around this?
Of course there is a way to fix this. You need to look at the documentation and understand what your code is doing.
https://msdn.microsoft.com/en-us/library/ms188043.aspx
Note the third parameter to STUFF is length. In the code posted above it is 2. You need to change that to a 1.
_______________________________________________________________
Need help? Help us help you.
Read the article at http://www.sqlservercentral.com/articles/Best+Practices/61537/ for best practices on asking questions.
Need to split a string? Try Jeff Modens splitter http://www.sqlservercentral.com/articles/Tally+Table/72993/.
Cross Tabs and Pivots, Part 1 – Converting Rows to Columns - http://www.sqlservercentral.com/articles/T-SQL/63681/
Cross Tabs and Pivots, Part 2 - Dynamic Cross Tabs - http://www.sqlservercentral.com/articles/Crosstab/65048/
Understanding and Using APPLY (Part 1) - http://www.sqlservercentral.com/articles/APPLY/69953/
Understanding and Using APPLY (Part 2) - http://www.sqlservercentral.com/articles/APPLY/69954/
February 18, 2015 at 12:47 pm
I believe you removed the blank space after the comma, then you must change the third parameter of the function Stuff to 1:
,1, 1, '') as [Mobile_Short_Desc]
Hope this helps.
February 18, 2015 at 12:53 pm
Thanks, I'll read that article on STUFF now to try and understand.
Viewing 9 posts - 1 through 8 (of 8 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