Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
rridgley
Starting Member
1 Post |
Posted - 2011-07-15 : 10:13:48
|
Hello, I am looking for some help with the following query. I am trying to see if there is a way to return 1 row with all results. Please see code below to better understand what I am trying to accomplish if possible. Here is my SelectSELECT B.ID, E.SSNO, E.LASTNAME, E.FIRSTNAME, B.STATUS, A.DESCRIPTFROM EMP EJOIN BADGE B ON E.ID = B.EMPIDJOIN BADGELINK BL ON B.BADGEKEY = BL.BADGEKEYJOIN ACCESSLVL A ON BL.ACCLVLID = A.ACCESSLVID WHERE B.STATUS = 1 AND A.DESCRIPT = 'SwissLog_1' OR A.DESCRIPT = 'SwissLog_2' OR A.DESCRIPT = 'SwissLog_3' OR A.DESCRIPT= 'SwissLog_4'Which returns this:ID SSNO FIRSTNAME LATNAME STATUS DESCRIPT44199 a3354 John Doe 1 SwissLog_144199 a3354 John Doe 1 SwissLog_244199 a3354 John Doe 1 SwissLog_344199 a3354 John Doe 1 SwissLog_4This is exactly the data I am looking for but if you notice the descript is different for each row, I want to see if I can dynamically create new columns and get it all on the same row. I would like the new result to look something like this.ID SSNO FIRSTNAME LATNAME STATUS DESCRIPT1 DESCRIPT2 DESCRIPT3 DESCRIPT444199 a3354 John Doe 1 SwissLog_1 SwissLog_2 SwissLog_3 SwissLog_4Then to take this a step further, I want to add some logic to it. IF A.DESCRIPT = ‘SwissLog_1’ THEN DESCRIPT1 = true ELSE DESCRIPT1 = false, IF A.DESCRIPT = ‘SwissLog_2’ TEHN DESCRIPT2 = true ELSE DESCRIPT2 = false, etc. So the ultimate final result would look something like this:ID SSNO FIRSTNAME LATNAME STATUS DESCRIPT1 DESCRIPT2 DESCRIPT3 DESCRIPT444199 a3354 John Doe 1 true true true true44200 a1234 Randy Ridgley 1 false true true true…. |
|
livezone
Starting Member
10 Posts |
Posted - 2011-07-18 : 12:49:41
|
Answer to your first question is below:1. Creata a function as shown belowCreate Function dbo.FormatData ( @accesslvid int)returns varchar(1000)asBeginDECLARE @allDescription varchar(1000)SELECT @allDescription = COALESCE(@allDescription + ' ', '') + DESCRIPTFrom ACCESSLVL Where ACCESSLVID = @accesslvidreturn @allDescriptionEndchange your statement as shown belowSELECT distinct B.ID, E.SSNO, E.LASTNAME, E.FIRSTNAME, B.STATUS, dbo.FormatData (BL.ACCLVLID ) as 'DESCRIPT1 DESCRIPT2 DESCRIPT3 DESCRIPT4'FROM EMP EJOIN BADGE B ON E.ID = B.EMPIDJOIN BADGELINK BL ON B.BADGEKEY = BL.BADGEKEYJOIN ACCESSLVL A ON BL.ACCLVLID = A.ACCESSLVID WHERE B.STATUS = 1 AND A.DESCRIPT = 'SwissLog_1' OR A.DESCRIPT = 'SwissLog_2' OR A.DESCRIPT = 'SwissLog_3' OR A.DESCRIPT= 'SwissLog_4'Answer to 2nd question should follow |
 |
|
livezone
Starting Member
10 Posts |
Posted - 2011-07-18 : 13:02:22
|
;With CTE AS (SELECT B.ID, E.SSNO, E.LASTNAME, E.FIRSTNAME, B.STATUS, A.DESCRIPTFROM EMP EJOIN BADGE B ON E.ID = B.EMPIDJOIN BADGELINK BL ON B.BADGEKEY = BL.BADGEKEYJOIN ACCESSLVL A ON BL.ACCLVLID = A.ACCESSLVID WHERE B.STATUS = 1 AND A.DESCRIPT = 'SwissLog_1' OR A.DESCRIPT = 'SwissLog_2' OR A.DESCRIPT = 'SwissLog_3' OR A.DESCRIPT= 'SwissLog_4' )Select ID, SSNO, LASTNAME, FIRSTNAME, STATUS, Case When [SwissLog_1] = 'SwissLog_1' Then 'True' else 'False' end as DESCRIPT1, Case When [SwissLog_2] = 'SwissLog_2' Then 'True' else 'False' end as DESCRIPT2 , Case When [SwissLog_3] = 'SwissLog_3' Then 'True' else 'False' end as DESCRIPT3, Case When [SwissLog_4] = 'SwissLog_4' Then 'True' else 'False' end as DESCRIPT4from CTEPIVOT(Min(DESCRIPT)For [DESCRIPT] in ( [SwissLog_1], [SwissLog_2], [SwissLog_3], [SwissLog_4]) ) as Pvt |
 |
|
|
|
|
|
|