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
Post a Comment