stats.html 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <h1>Statistik sortiert nach Klassen</h1>
  2. <h3>Durchschnittsnoten FHR, d.h. nur Absolventen werden berücksichtigt</h3>
  3. Legende: Schulnummer, Anzahl der Schüler von abgehender Schule, Schnitt, davon gültige Einträge
  4. <br>
  5. <button on:click="getKlasse('A')">A-Klassen</button>
  6. <button on:click="getKlasse('B')">B-Klassen</button>
  7. <button on:click="getKlasse('C')">C-Klassen</button>
  8. <button on:click="getKlasse('D')">D-Klassen</button>
  9. <button on:click="getKlasse('E')">E-Klassen</button>
  10. <button on:click="getKlasse('F')">F-Klassen</button>
  11. <button on:click="getKlasse('G')">G-Klassen</button>
  12. <button on:click="getKlasse('H')">H-Klassen</button>
  13. {#each Object.entries(schulen) as [schule, values]}
  14. <br>{schule}: {values.length} -> Durchschnittsnote: {dsn(values).join(': ')}
  15. {/each}
  16. <h3>DSN nach Alter bzw. Geburtsjahr</h3>
  17. {#each Object.entries(dsnNachAlter) as [baujahr, values]}
  18. <br>{baujahr}: {values.length} -> Durchschnittsnote: {dsn(values)[0]}
  19. {/each}
  20. <h3>FOS11 nach Alter und D,M,E</h3>
  21. {#each Object.entries(dmeNachAlter) as [baujahr, values]}
  22. <br>{baujahr}: {values.length} -> Durchschnittsnote: {dme(values)}
  23. {/each}
  24. <script>
  25. export default {
  26. setup(Component) {Component.bez = 'Statistik'},
  27. oncreate () {
  28. const { knex } = this.get()
  29. R.objection.Model.knex(R.knex({
  30. client: 'mysql',
  31. useNullAsDefault: true,
  32. connection: {
  33. host: knex.host,
  34. database: knex.name,
  35. user: knex.user,
  36. password: knex.password,
  37. charset: 'utf8'
  38. }
  39. }))
  40. },
  41. helpers: {
  42. dme (a) {
  43. const arr = R.lodash.filter(a, a => a.abschnitte && a.abschnitte[1] && a.abschnitte[1].noten[0] && a.abschnitte[1].noten[0].NotenKrz)
  44. let ln = arr.length
  45. // console.log(arr)
  46. const r = arr.reduce((total, value) => {
  47. const noten = R.lodash.filter(value.abschnitte[1].noten, n => ['DEKO', 'EN', 'MA'].includes(n.fach.FachKrz))
  48. const summe = noten.reduce((t, v) => t + parseFloat(v.NotenKrz), 0)/3
  49. return total + summe
  50. }, 0)
  51. // console.log(r)
  52. return `${(r / ln)} (${ln}/${a.length})`
  53. },
  54. dsn (arr) {
  55. let ln = arr.length
  56. const r = arr.reduce((total, value) => {
  57. const float = parseFloat(value.DurchschnittsnoteFHR.replace(',', '.'))
  58. if (float) return total + float
  59. else ln += -1
  60. return total
  61. }, 0)
  62. return [(r / ln).toFixed(1), ln, arr.length]
  63. },
  64. },
  65. methods: {
  66. async getKlasse (pattern) {
  67. const schueler = await R.models.Schueler.query()
  68. .where('Klasse', 'like', pattern + '%')
  69. .eager('abschnitte.[noten.fach]')
  70. this.set({gruppe: schueler})
  71. }
  72. },
  73. computed: {
  74. schulen: ({gruppe}) => {
  75. const dsn = R.lodash.filter(gruppe, 'DurchschnittsnoteFHR')
  76. return R.lodash.groupBy(dsn, 'LSSchulNr')
  77. },
  78. dsnNachAlter: ({gruppe}) => {
  79. const dsn = R.lodash.filter(gruppe, 'DurchschnittsnoteFHR')
  80. return R.lodash.groupBy(dsn, (s) => { return new Date(s.Geburtsdatum).getFullYear()})
  81. // console.log(R.lodash([1,2,3,4])) //, (s) => { return new Date(s.Geburtsdatum).getFullYear()}))
  82. },
  83. dmeNachAlter: ({gruppe}) => {
  84. const fos11 = R.lodash.filter(gruppe, s => s['PruefOrdnung'] === 'APO-BK-11/C-FOS' && s.status === "8")
  85. return R.lodash.groupBy(fos11, (s) => { return new Date(s.Geburtsdatum).getFullYear()})
  86. }
  87. // }
  88. },
  89. data () {
  90. return {
  91. gruppe: null
  92. }
  93. }
  94. }
  95. </script>