Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagesql
titleSQL
linenumberstrue
collapsetrue
---
-- Opinnot, suoritukset, opintopisteet
---
--
-- "opintopistekysymykset eivät koske jatkotutkintoja opiskelevia, joille opintopistetietoja ei merkitä"
-- Opintopisteitä varten tehdä oma erillinen aputaulu
-- Temp-taulu tietojen valintaa varten
-- NB! param-taulussa saa olla vain yksi rivi!
IF OBJECT_ID('tempdb..#pisteet') IS NOT NULL
BEGIN
	truncate table #pisteet
	drop table #pisteet
	if @debug<>0 print convert(varchar,getdate(),120)+' DROP temp-taulu pisteet'
END
;
create table #pisteet (
	opiskelija_id int not null,
	opiskeluoikeus_id int,
	opintosuoritus_id int not null,
	laajuus decimal(18,6) not null,
	suoritus_pvm date not null,
	hyvaksiluettu_pvm date,
	oylio bit,
	aylio bit,
	mylio bit,
	amk bit,
	ulk bit,
	muu bit
)
if @debug<>0 print convert(varchar,getdate(),120)+' CREATE temp-taulu pisteet'
;
-- TODO: OSUUDET
insert into #pisteet (opiskelija_id,opiskeluoikeus_id,opintosuoritus_id,laajuus,suoritus_pvm,hyvaksiluettu_pvm,oylio,aylio,mylio,amk,ulk,muu)
	select s.OpiskelijaID as opiskelija_id
	, s.OpiskeluoikeusID as opiskeluoikeus_id
	, s.ID as opintosuoritus_id
	, s.Laajuus as laajuus
	, s.Suorituspaivamaara as suoritus_pvm
	, shl.Hyvaksilukupaivamaara as hyvaksiluettu_pvm
	-- opintopisteiden jaottelu
	-- oma ylio: käytetään halpaa logiikkaa, eli yhteensä miinus muut. tässä null kunnes..!
	, null as oylio
	--avoin ylio
	,coalesce((select distinct 1
	  from Op_suor_liittyva_luokittelu ll
	  inner join Op_suor_luokittelu k on k.ID=ll.Opintosuorituksen_luokitteluID
	  where ll.OpintosuoritusID=s.ID
	  and k.Koodi='1' -- avoimessa
	 ),0) as aylio
	--muu ylio
	,coalesce((select distinct 1
	  from Op_suorituksen_organisaatio sg
	  inner join Organisaatio g on g.ID=sg.OrganisaatioID
	  inner join Organisaation_rooli gr on gr.ID=sg.Organisaation_rooliID
	  where sg.OpintosuoritusID=s.ID
	  and(gr.Koodi='2' -- järjestävä
	   or(gr.Koodi='3' and shl.Hyvaksilukupaivamaara is not null) --hyväksiluettu
	  )
	  and(g.Koodi in (
			SELECT Organisaatio_koodi FROM Yhteiset.Koodistot.Organisaatio_Oppilaitostyyppi
			WHERE Oppilaitostyyppi_koodi='42' or Oppilaitostyyppi_koodi='43'
		)
	   or g.Koodi='42' or g.Koodi='43'
	  )
	  -- ei oma yliopisto
	  and g.Koodi <> (select OrganisaatioKoodi from Yhteiset.Asetukset.Instanssit where DB=(select org from #param))
	  -- varmuuden vuoksi/yhteentoimivuus
	  and g.Koodi <> (select kk from #param)
	 ),0) as mylio
	--amk
	,coalesce((select distinct 1
	  from Op_suorituksen_organisaatio sg
	  inner join Organisaatio g on g.ID=sg.OrganisaatioID
	  inner join Organisaation_rooli gr on gr.ID=sg.Organisaation_rooliID
	  where sg.OpintosuoritusID=s.ID
	  and(gr.Koodi='2' -- järjestävä
	   or(gr.Koodi='3' and shl.Hyvaksilukupaivamaara is not null) --hyväksiluettu
	  )
	  and(g.Koodi in (SELECT Organisaatio_koodi FROM Yhteiset.Koodistot.Organisaatio_Oppilaitostyyppi WHERE Oppilaitostyyppi_koodi='41')
	   or g.Koodi='41'
	  )
	  -- ei oma yliopisto
	  and g.Koodi <> (select OrganisaatioKoodi from Yhteiset.Asetukset.Instanssit where DB=(select org from #param))
	  -- varmuuden vuoksi/yhteentoimivuus
	  and g.Koodi <> (select kk from #param)
	 ),0) as amk
	--ulk
	,coalesce((select distinct 1
	  from Op_suorituksen_organisaatio sg
	  inner join Organisaatio g on g.ID=sg.OrganisaatioID
	  inner join Organisaation_rooli gr on gr.ID=sg.Organisaation_rooliID
	  where sg.OpintosuoritusID=s.ID
	  and(gr.Koodi='2' -- järjestävä
	   or(gr.Koodi='3' and shl.Hyvaksilukupaivamaara is not null) --hyväksiluettu
	  )
	  --ei tarvita: and g.Koodi not in (SELECT Organisaatio_koodi FROM Yhteiset.Koodistot.Organisaatio_Oppilaitostyyppi)
	  and g.Koodi in ('UK','UM')
	  -- ei oma yliopisto
	  and g.Koodi <> (select OrganisaatioKoodi from Yhteiset.Asetukset.Instanssit where DB=(select org from #param))
	  -- varmuuden vuoksi/yhteentoimivuus
	  and g.Koodi <> (select kk from #param)
	 ),0) as ulk
	--muu
	,coalesce((select distinct 1
	  from Op_suorituksen_organisaatio sg
	  inner join Organisaatio g on g.ID=sg.OrganisaatioID
	  inner join Organisaation_rooli gr on gr.ID=sg.Organisaation_rooliID
	  where sg.OpintosuoritusID=s.ID
	  and(gr.Koodi='2' -- järjestävä
	   or(gr.Koodi='3' and shl.Hyvaksilukupaivamaara is not null) --hyväksiluettu
	  )
	  -- XX yksin ei riitä
	  --and g.Koodi in ('XX')
	  --DONE-ish? opplaittyyp tarkistus!
	  and(g.Koodi in (
			SELECT Organisaatio_koodi FROM Yhteiset.Koodistot.Organisaatio_Oppilaitostyyppi
			WHERE Oppilaitostyyppi_koodi is not null and Oppilaitostyyppi_koodi not in ('41','42','43')
		)
	   or g.Koodi in ('63','64','66','99','Muu','XX')
	  )
	  -- leikataan nämä pois
	  and g.Koodi not in (select Asetus from Yhteiset.Asetukset.Ohjaus_Parametrit p where p.Toiminto='Oppilaitostyyppi')
	  and g.Koodi not in ('41','42','43','UK','UM')
	  -- ei oma yliopisto
	  and g.Koodi <> (select OrganisaatioKoodi from Yhteiset.Asetukset.Instanssit where DB=(select org from #param))
	  -- varmuuden vuoksi/yhteentoimivuus
	  and g.Koodi <> (select kk from #param)
	 ),0) as muu
	from Opintosuoritus s
	inner join Opintosuorituksen_laji sl on sl.ID=s.Opintosuorituksen_lajiID
	-- HYVÄKSILUETTU
	left join Opsuorituksen_hyvaksiluku shl on shl.OpintosuoritusID=s.ID
	cross join #param -- saa olla vain yksi rivi!
	where 1=1
	--muu opintosuoritus
	and sl.Koodi='2'
	-- lehtitaso, tai ei ainakaan vanhempi (lajeja 3 ja 4 ei huomioida)
	and s.ID not in (
		select ss.OpintosuoritusID from Op_suor_sisaltyvyys ss
		-- 2015-01-19: lajeja 3 ja 4 ei huomioida
		where ss.OpintosuoritusID not in (
			select sss.ID
			from Opintosuoritus sss
			inner join Opintosuorituksen_laji sssl on sssl.ID=sss.Opintosuorituksen_lajiID
			where sssl.Koodi in ('3','4')
		)
	)
	-- mukaan vain tutkinnon suorittaneiden pisteet!
	and s.OpiskelijaID in (select T.opiskelija_id from #tktutk T)
	
;
CREATE NONCLUSTERED INDEX IX_pisteet_opiskelija_id ON #pisteet (opiskelija_id)
INCLUDE (opiskeluoikeus_id,opintosuoritus_id,laajuus,suoritus_pvm)
;
CREATE NONCLUSTERED INDEX IX_pisteet_suoritus_pvm ON #pisteet (suoritus_pvm)
INCLUDE (opiskelija_id,opiskeluoikeus_id,laajuus)
;
CREATE NONCLUSTERED INDEX IX_pisteet_hyvaksiluettu_pvm ON #pisteet (hyvaksiluettu_pvm)
INCLUDE (opiskelija_id,opiskeluoikeus_id,laajuus,suoritus_pvm)
;
--select * from #pisteet
-- suoritusten hierarkia-aputaulu
-- tehdään hierarkiasta kaksitasoinen
-- sisältyvyys-hierarkia:
--  TUTK
--    KOK
--      LEHTI
-- => tauluksi jossa lehtitason suoritus linkitetään kaikkiin sen vanhempiin:
--  LEHTI KOK
--  LEHTI TUTK
--/*
IF OBJECT_ID('tempdb..#suoritushierarkia') IS NOT NULL
BEGIN
	truncate table #suoritushierarkia
	drop table #suoritushierarkia
--	if @debug<>0 print convert(varchar,getdate(),120)+' DROP temp-taulu pisteet'
END
;
create table #suoritushierarkia (
	opiskelija_id int not null,
	suoritus_id int not null,
	vanhempi_id int not null
)
;
-- rekursiivisella CTE (common table expression) kyselyllä
-- * vahdittava että toimii sillä on virheherkkä!
--   löytää kyllä silmukoita (jättää ulos tuloksesta), mutta esimerkiksi
--   linkki itseensä joissakin tilanteissa on tälle kyselylle liikaa.
-- => linkit itseensä on erikseen katsottu kyselyssä pois!
;WITH  dcba --lehdestä alkaen!
AS (
	-- anchor
	SELECT  OpintosuoritusID2 as id, OpintosuoritusID2 as lapsi, OpintosuoritusID2 as lehti
	FROM    Op_suor_sisaltyvyys
	WHERE   OpintosuoritusID2 NOT in (
		-- lehtitaso, tai ei ainakaan vanhempi (lajeja 3 ja 4 ei huomioida)
		select ss.OpintosuoritusID from Op_suor_sisaltyvyys ss
		-- 2015-01-19: lajeja 3 ja 4 ei huomioida
		where ss.OpintosuoritusID not in (
			select sss.ID
			from Opintosuoritus sss
			inner join Opintosuorituksen_laji sssl on sssl.ID=sss.Opintosuorituksen_lajiID
			where sssl.Koodi in ('3','4')
		)
	)
	-- voi olla monta kertaa, joten:
	group by OpintosuoritusID2
	UNION ALL
	-- recursive member
	SELECT     r.OpintosuoritusID as id, r.OpintosuoritusID2 as lapsi, a.lehti
	FROM       Op_suor_sisaltyvyys AS r
	INNER JOIN dcba AS a ON r.OpintosuoritusID2 = a.id
	WHERE r.OpintosuoritusID<>r.OpintosuoritusID2 -- estetään linkit itseensä!
)
INSERT INTO #suoritushierarkia (opiskelija_id,suoritus_id,vanhempi_id)
SELECT DISTINCT s.opiskelijaID,dcba.lehti,s.ID
FROM Opintosuoritus s
left join dcba on dcba.id=s.ID
WHERE 1=1
and dcba.lehti is not null
-- mukaan vain tutkinnon suorittaneiden pisteet!
and s.OpiskelijaID in (select T.opiskelija_id from #tktutk T)
-- rekursion määrä (0 sallisi kaiken), eli hierarkian maksimisyvyys
option (maxrecursion 20)
;
CREATE NONCLUSTERED INDEX IX_suoritushierarkia_opiskelija_id ON #suoritushierarkia (opiskelija_id)
INCLUDE (suoritus_id,vanhempi_id)
;
CREATE NONCLUSTERED INDEX IX_suoritushierarkia_suoritus_id ON #suoritushierarkia (suoritus_id)
INCLUDE (opiskelija_id,vanhempi_id)
;
CREATE NONCLUSTERED INDEX IX_suoritushierarkia_vanhempi_id ON #suoritushierarkia (vanhempi_id)
INCLUDE (opiskelija_id,suoritus_id)
;

---
-- Opinnot, suoritukset, opintopisteet
---
-- EI KOSKE JATKOTUTKINTOJA (koulk: 8%,775%)

--
-- VIRTA-625: Lisätään tutkinto-opintosuorituksen opintopisteet mukaan tiedonkeruuseen.
-- NB! "omassa yliopistossa suoritetut opintopisteet" on nyt tutkinto-opintosuorituksen
--  opintopisteet miinus muiden kategorioiden mukaisesti suoritetut opintopisteet
update T
set optutk = cast(cast(round(s.Laajuus,0) as int) as varchar)
from #tktutk T
inner join Opintosuoritus s on s.ID=T.opintosuoritus_id
where T.optutk is null
-- ei jatkotutkintoja:
AND T.koulky NOT LIKE '8%' --lisensiaatit, tohtorit
--AND T.koulky NOT LIKE '775%' --erikois[*]lääkärit
AND T.koulky NOT IN ('775101','775201','775999')

;
-- Minkä perusteella katsotaan kuuluuko suoritus mukaan laskettaviin?
-- - sisältyvyydet (hierarkia)
-- VAI
-- - opiskeluoikeus-kytkös
-- SISÄLTYVYYS (HIERARKIA)
IF (0 < (SELECT TOP 1 COUNT(*) FROM Op_suor_sisaltyvyys)) BEGIN
	-- kategoriat ja yhteensä (summa lehtitasolta)
	update T
	set
	 --opoylio :: oma yliopisto erikseen. ks. alla!
	 opaylio=(
	  select cast(cast(round(sum(
		-- sekä oman yo:n että muut
		case when s.aylio = 1 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	, opmylio=(
	  select cast(cast(round(sum(
		-- muu yo (nb! pl. avoin)
		case when s.mylio = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	, opamk=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.amk = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	, opulk=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.ulk = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	, opmuu=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.muu = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	, opyht=(
	  select cast(cast(round(sum(
		s.Laajuus),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and  s.opintosuoritus_id in
		(select suoritus_id from #suoritushierarkia where opiskelija_id=T.opiskelija_id and vanhempi_id=T.opintosuoritus_id)
	  group by s.opiskelija_id
	)
	from #tktutk T
	where T.opyht is null
	-- ei jatkotutkintoja:
	AND T.koulky NOT LIKE '8%' --lisensiaatit, tohtorit
    --AND T.koulky NOT LIKE '775%' --erikois[*]lääkärit
    AND T.koulky NOT IN ('775101','775201','775999')
	;
-- OPISKELUOIKEUS-KYTKÖS
END ELSE BEGIN
	-- kategoriat ja yhteensä (summa lehtitasolta)
	update T
	set
	 --opoylio :: oma yliopisto erikseen. ks. alla!
	 opaylio=(
	  select cast(cast(round(sum(
		-- sekä oman yo:n että muut
		case when s.aylio = 1 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	, opmylio=(
	  select cast(cast(round(sum(
		-- muu yo (nb! pl. avoin)
		case when s.mylio = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	, opamk=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.amk = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	, opulk=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.ulk = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	, opmuu=(
	  select cast(cast(round(sum(
		-- nb! pl. avoin; oma lisäys!
		case when s.muu = 1 and s.aylio=0 then s.Laajuus else 0 end),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	, opyht=(
	  select cast(cast(round(sum(
		s.Laajuus),0) as int) as varchar)
	  from #pisteet s
	  where s.opiskelija_id=T.opiskelija_id
	  and s.opiskeluoikeus_id=T.opiskeluoikeus_id
	  group by s.opiskelija_id
	)
	from #tktutk T
	where T.opyht is null
	-- ei jatkotutkintoja:
	AND T.koulky NOT LIKE '8%' --lisensiaatit, tohtorit
	AND T.koulky NOT LIKE '775%' --erikois[*]lääkärit
	;
END -- hierarkia vs opiskeluoikeus-kytkös

-- oma yliopisto: = "yhteensä - muut kategoriat"
-- VIRTA-625: oma yliopisto = tutkinnon opintopisteet - muut kategoriat
update T
set opoylio = cast(
	--cast(coalesce(opyht,0) as int)
	cast(coalesce(optutk,0) as int)
	- (
	   cast(coalesce(opaylio,0) as int)
	 + cast(coalesce(opmylio,0) as int)
	 + cast(coalesce(opamk,0) as int)
	 + cast(coalesce(opulk,0) as int)
	 + cast(coalesce(opmuu,0) as int)
	)
as varchar)
from #tktutk T
where 1=1
-- ei jatkotutkintoja:
AND T.koulky NOT LIKE '8%' --lisensiaatit, tohtorit
--AND T.koulky NOT LIKE '775%' --erikois[*]lääkärit
AND T.koulky NOT IN ('775101','775201','775999')
;

-- 2018-01-14 
-- 2018-01-04
-- 2017-12-18
-- 2017-06-30
-- SV-muuttuja vielä kerran kun opintosuoritusten hierarkia on käytettävissä    
UPDATE T
SET T.sv='001'
FROM #tktutk T
inner join #suoritushierarkia s on s.opiskelija_id=T.opiskelija_id and s.vanhempi_id=T.opintosuoritus_id
inner join virta.dbo.Henkilon_patevyys hp on hp.OpintosuoritusID=s.vanhempi_id
inner join virta.dbo.Patevyys p on p.ID=hp.PatevyysID
WHERE T.sv is null
AND p.Koodi in ('ik','il','im') --opettaja, erill opet pedag opinn
AND T.koulky NOT LIKE '6%'
AND T.koulky NOT LIKE '8%'
AND T.suorituspaivamaara >= hp.Alkamispaivamaara
;

-- Vain JY hierarkian vanhempi suoritus
UPDATE T
SET T.sv='001'
FROM #tktutk T
inner join #suoritushierarkia s on s.opiskelija_id=T.opiskelija_id --and s.vanhempi_id=T.opintosuoritus_id
inner join virta.dbo.Henkilon_patevyys hp on hp.OpintosuoritusID=s.vanhempi_id
inner join virta.dbo.Patevyys p on p.ID=hp.PatevyysID
WHERE T.sv is null
AND    HP.db = 'JY'
AND p.Koodi in ('ik','il','im') --opettaja, erill opet pedag opinn

AND T.koulky NOT LIKE '6%'
AND T.koulky NOT LIKE '8%'
AND T.suorituspaivamaara >= hp.Alkamispaivamaara
;



-- 2017-07-01 Jos Kirtu tyhjä Erikoislääkäri, opiskeluoikeuden alkamispaivamaara
-- kirtu
UPDATE T
SET kirtu=(cast(year(o.Alkamispaivamaara) as varchar)
         +(case
           -- 8-12 (elo-joulu): syksy
           when month(o.Alkamispaivamaara)>=8 then '2'
           -- 1-7 (tammi-heinä): kevät
           else '1'
           end)
    )
FROM #tktutk T
inner join virta.dbo.Opiskeluoikeus o on o.ID=T.opiskeluoikeus_id
WHERE kirtu IS NULL
AND T.koulky IN ('775101','775201','775999')
;     

 

Kansainvälinen tutkinto (kvtutk)

 

Poimitaan opintosuorituksen luokittelu 9 tai 10 jos löytyy.

 

Code Block
languagesql
titleSQL
linenumberstrue
collapsetrue
-- kvtutk tiedon päivitys
UPDATE T
SET  T.kvtutk = OSLL.koodi
FROM #tktutk T
    INNER JOIN virta.dbo.Op_suor_liittyva_luokittelu OSL ON OSL.OpintosuoritusID = T.opintosuoritus_id
    INNER JOIN virta.dbo.Op_suor_luokittelu OSLL ON OSLL.id = OSL.Opintosuorituksen_luokitteluID
WHERE OSLL.Koodi IN ('9','10')


-- päivitetään kvtutk tyhjä tiedoksi jos se on NULL
UPDATE #tktutk set kvtutk = ''  where kvtutk IS NULL

 

Tulos

Code Block
languagesql
titleSQL
linenumberstrue
collapsetrue
---
-- TULOS
---
-- CSV-sarakkeet
select
 ISNULL(kk,'')     as "Yliopisto" --(kk)
,ISNULL(ht,'')        "Henkilötunnus" --(ht)
,ISNULL(kirtu,'')     "Kirjoihintulo yliopistoon" --(kirtu)
,ISNULL(opoik,'')     "Opiskeluoikeuden alkaminen nykyisessä tutkinnossa" --(opoik)
,ISNULL(sv,'')        "Aineenopettajan pedagogiset opinnot" --(sv)
,ISNULL(om,'')        "Opiskelumuoto" --(om)
,ISNULL(suorpvm,'')   "Tutkinnon suorituspäivämäärä" --(suorpvm)
,ISNULL(kkun,'')      "Koulutusyksikön sijaintikunta" --(kkun)
,ISNULL(sp,'')        "Sukupuoli" --(sp)
,ISNULL(aikieliy,'')  "Äidinkieli" --(aikieliy)
,ISNULL(kansaly,'')   "Kansalaisuus" --(kansaly)
,ISNULL(snimi,'')     "Sukunimi" --(snimi)
,ISNULL(enimi,'')     "Etunimet" --(enimi)
,ISNULL(opoylio,'')   "Omassa yliopistossa suoritetut opintopisteet (pl. avoin yliopisto-opetus)" --(opoylio)
,ISNULL(opaylio,'')   "Avoimessa yliopisto-opetuksessa suoritetut opintopisteet (sekä omat että muu yliopisto)" --(opaylio)
,ISNULL(opmylio,'')   "Muissa yliopistoissa suoritetut opintopisteet (pl. avoin yliopisto)" --(opmylio)
,ISNULL(opamk,'')     "Ammattikorkeakouluissa suoritetut opintopisteet" --(opamk)
,ISNULL(opulk,'')     "Ulkomailla suoritetut opintopisteet" --(opulk)
,ISNULL(opmuu,'')     "Muualla suoritetut opintopisteet" --(opmuu)
,ISNULL(opyht,'')     "Opintopisteet yhteensä" --(opyht)
,ISNULL(lkmmt,'')     "Lukukausimaksukokeilu ja maksullinen tilauskoulutus" --(lkmmt)
,ISNULL(koulky,'')    "Koulutuskoodi" --(koulky)
-- VIRTA-625: tutkinto-opintosuorituksen opintopisteet
,ISNULL(optutk,'')     "Tutkinnon opintopisteet" --()
, ohjauksenAla			"OKM Ohjauksen ala"
, ekkoodi				"Erikoistumiskoulutuksen koodi"
 -- korkeakoulujen pyynnöstä, lisäkentät
,T.opiskelijaavain      "Opiskelija-avain"
,T.opiskeluoikeusavain  "Opiskeluoikeusavain"
,T.opintosuoritusavain  "Opintosuoritusavain"
from #tktutk T
where T.opintosuoritus_id is not null
order by ht,suorpvm,koulky

...