sql server - Dynamic SQL pivot -


i'm using following sql (with sql server 2016) pivot list of test results our lms (moodle):

select *       (select          u.firstname name,          u.lastname last_name,          u.idnumber id_number,          gi.itemname exam_name,          cast(gg.finalgrade / gi.grademax * 100 integer) grade                 mdl_grade_grades gg       inner join           mdl_grade_items gi on gg.itemid = gi.id       inner join           mdl_course c on gi.courseid = c.id       inner join           mdl_user u on gg.userid = u.id                (gi.itemname not null)           , (gi.courseid = 123)) source pivot      (max(grade)      exam_name in ([exam abc], [exam def], [exam ghi],                        [exam jkl], [exam xyz])     ) pivt order      id_number 

the result be:

name    last name   id number   division    region      branch      exam abc    exam def    exam ghi    exam jkl    exam xyz john    tester      3343664     abc         west rgn    agy       65                                  44 kenny   quipton     4342423     dda         central     rgn frn     88          66          90                      89 molefi  manase      5456545     ccs         abc rgn     xxx sol     74          90          85          80          77 

my issue exam names have hardcoded in for in(...) list, each time changes list has manually updated.

can sql rewritten using dynamic sql?

what better - using stuff() or for xml path, or else?

i can't use stored procedures (the application not support them).

this uses for xml should work same either way

declare @exams nvarchar(max), @sql nvarchar(max) set     @exams = select stuff(select ',',  + quotename(t.itemname)                          (                            select distinct gi.itemname                               mdl_grade_items gi                              gi.itemname not null , gi.courseid = 123                            order gi.itemname                           ) t               xml path(''), 0, 1, '')  set    @sql = n'     select *              (select            u.firstname name,            u.lastname last_name,            u.idnumber id_number,            gi.itemname exam_name,            cast(gg.finalgrade / gi.grademax * 100 integer) grade                      mdl_grade_grades gg          inner join             mdl_grade_items gi on gg.itemid = gi.id          inner join             mdl_course c on gi.courseid = c.id          inner join             mdl_user u on gg.userid = u.id                     (gi.itemname not null)             , (gi.courseid = 123)) source     pivot         (max(grade)          exam_name in (' + @exams + ')        ) pivt     order         id_number  '  exec sp_executesql @sql  

Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -