| Author |
Topic |
|
dineshreddy
Starting Member
7 Posts |
Posted - 2011-03-18 : 13:43:18
|
| I have to select the columns in table2 dynamically from c1 in Table1Table1 c1 c2 c3--------------------col1col2col3Need to get this select statement - col1,col2,col3 will come from c1 in Table1select col1,col2,col3 from table2where .. |
|
|
X002548
Not Just a Number
15586 Posts |
|
|
dineshreddy
Starting Member
7 Posts |
Posted - 2011-03-18 : 13:56:37
|
| @X002548Table1UserID RoleIDA0 1A0 2A1 3A1 1A2 1Table2UserID UserNMA0 billA1 timA2 johnTable3RoleID RoleNM1 admin2 sysadmin3 user4 generalResult Query :UserNM admin sysadmin user generalbill 1 1 0 0tim 1 0 1 0john 1 0 0 0 |
 |
|
|
jimf
Master Smack Fu Yak Hacker
2875 Posts |
Posted - 2011-03-18 : 14:20:28
|
| No need for Dynamic SQLDECLARE @Table1 TABLE(UserID char(2),RoleId tinyint)INSERT INTO @Table1SELECT 'A0', 1 UNION ALLSELECT 'A0',2 UNION ALLSELECT 'A1',3 UNION ALLSELECT 'A1',1 UNION ALLSELECT 'A2',1 DECLARE @Table2 TABLE(UserID char(2),UserNm varchar(5))INSERT INTO @Table2SELECT 'A0','bill' UNIONSELECT 'A1','tim' UNIONSELECT 'A2','john'DECLARE @Table3 TABLE(RoleId tinyint,RoleNm varchar(10))INSERT INTO @Table3SELECT 1,'admin' UNIONSELECT 2,'sysadmin' UNIONSELECT 3,'user' UNIONSELECT 4,'general'JimEveryday I learn something that somebody else already knew |
 |
|
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2011-03-18 : 14:29:16
|
| [code]SELECT UserNM, ADMIN, SysAdmin, [USER], GENERALFROM (SELECT A.UserNM, C.RoleNM, B.RoleID FROM Table2 A INNER JOIN Table1 B ON A.UserID=B.UserID LEFT JOIN Table3 C ON B.RoleID=C.RoleID) ZPIVOT(COUNT(RoleID) FOR RoleNM IN (ADMIN, SysAdmin, [USER], GENERAL)) B[/code]edit: removed temp table symbols |
 |
|
|
jimf
Master Smack Fu Yak Hacker
2875 Posts |
Posted - 2011-03-18 : 14:38:14
|
| I guess I should have added this part. But your solution is betterSELECT t2.UserNm,MAX(CASE WHEN t3.RoleNm = 'admin' THEN 1 ELSE 0 END) as [Admin],MAX(CASE WHEN t3.RoleNm = 'sysadmin' THEN 1 ELSE 0 END) as [sysAdmin],MAX(CASE WHEN t3.RoleNm = 'user' THEN 1 ELSE 0 END) as [user],MAX(CASE WHEN t3.RoleNm = 'general' THEN 1 ELSE 0 END) as [general]FROM @table2 t2 INNER JOIN @table1 t1 ON t2.UserId = t1.UserIDINNER JOIN @table3 t3 ON t1.roleId = t3.RoleID GROUP BY t2.UserNmJimEveryday I learn something that somebody else already knew |
 |
|
|
dineshreddy
Starting Member
7 Posts |
Posted - 2011-03-18 : 14:51:25
|
| What if a new role is added in Table3 ? Do we have to manually change the query (or) Is there an alternative to handle this situation ? |
 |
|
|
robvolk
Most Valuable Yak
15732 Posts |
|
|
robvolk
Most Valuable Yak
15732 Posts |
|
|
|