4

Statistik, Klassenhäufigkeit

Beim Erstellen von statistischen Funktionen entstand bei mir auch eine recht nette, vielleicht sogar bedingt alltagstaugliche Funktion für Ninox. Es handelt sich um die Klassenhäufigkeitsfunktion.

Hat man z.B. eine Tabelle, in der alle Rechnungen stehen und haben diese Rechnungen unterschiedliche Beträge, dann werden sie in Abschnitte (Klassen) aufgeteilt und anschliessend getrennt nach Häufigkeit und Teilsumme analysiert. So erhält man einen Überblick, über welche Bereiche sich die eigenen Rechnungen verteilen, wo der höchste, anteilige Umsatz erreicht wird, oder die meisten Rechnungen erstellt werden.

Zeile 3 heißt z.B.: Rechnungen im Bereich von 24-36€, machen 7% des Umsatzes aus, was 337€ entspricht. Es existieren 17 solcher Rechnungen, was 13,2% aller Rechnungen bedeutet.

Da diese Tabelle über die Optik wirkt, habe ich mich für html und css entschieden, trotz der bekannten Nachteile. Das Script kann in jede Tabelle in ein Funktionsfeld eingefügt werden oder in ein Dashboard. Die ersten 5 Zeilen müssen angepasst werden, sie sind aber selbsterklärend. Findet jemand Fehler, dann bin ich interessiert. Gruß Mirko

So sieht es aus:

 

Und das ist das Script:

"1. select mit Feld, 2. select ohne Feld, 3. Feldname in dem die Daten stehen, 4. Anzahl der gewünschten Klassen, 5. Einheit des Datenfelds";
let dataArray := (select Rechnungen).Betrag;
let tableSelect := (select Rechnungen);
let fieldName := "Betrag";
let cntClass := 5;
let einheit := " €";
"------------------------------------------------------------------------------------------------";
let endRange := round(max(dataArray) + 1);
while endRange % cntClass != 0 do
    endRange := endRange + 1
end
;
let maxValueOfLastRange := endRange;
let rangeDistance := maxValueOfLastRange / cntClass;
let resultSum := for i in range(rangeDistance, maxValueOfLastRange + 1, rangeDistance) do
        let lowerBound := i - rangeDistance;
        round(number(sum(for j in tableSelect do
                if j.eval(---
{ fieldName }
---, this) <= i and j.eval(---
{ fieldName }
---, this) > lowerBound then
                    j.eval(---
{ fieldName }
---, this)
                end
            end)), 1)
    end;
let resultCnt := for i in range(rangeDistance, maxValueOfLastRange + 1, rangeDistance) do
        let lowerBound := i - rangeDistance;
        round(cnt(for j in tableSelect do
                if j.eval(---
{ fieldName }
---, this) <= i and j.eval(---
{ fieldName }
---, this) > lowerBound then
                    j.eval(---
{ fieldName }
---, this)
                end
            end), 1)
    end;
let resultRelativeSum := for i in resultSum do
        round(i / sum(resultSum) * 100, 1)
    end;
let resultRelativeCnt := for i in resultCnt do
        round(i / sum(resultCnt) * 100, 1)
    end;
let rangeParts := unique(for i in range(0, maxValueOfLastRange, rangeDistance) do
            "[" + lpad(text(i), 3, "0") + " - " + lpad(text(i + rangeDistance), 3, "0") + "]"
        end);
let content := "
<style>
table,td{
    border-left:thin solid #000;
    border-right:thin solid #000;
    border-color: rgb(159,159,159);
    border-collapse:collapse;
    font-family:Garamond;
    font-variant: small-caps;
    padding: .5em .5em;
    }
td{
    padding: .1em .5em;
    font-size:large;
    text-align:right
    }
thead,th{
    background-color:rgb(237,162,82);
    padding: .5em .5em;
    font-size:large;
    text-align:center;
    }
/*Zebrastreifen für Zeilen*/
tr:nth-child(odd) td{
      background-color: #e4ebf2;
      color: #000;
    }
tr:nth-child(even) td{
      background-color: rgb(237,162,82,.5);
      color: #000;
    }
</style>
<table>
    <thead>
        <tr>
            <th> Nr </th>
            <th> Klassen </th>
            <th scope='colgroup' colspan='2'> Summe pro Klasse </th>
            <th scope='colgroup' colspan='2'> Anzahl pro Klasse </th>
        </tr>
    </thead>
    <tbody>
                " + for i in range(0, cntClass) do
        "<tr><td> " + (i + 1) + " </td><td> " + item(rangeParts, i) + " </td><td> " + format(item(resultSum, i), "#,##0.00") + einheit + " </td><td style = text-align:left> " + item(resultRelativeSum, i) + "&#37;" + "</td><td> " + item(resultCnt, i) + " </td><td style = text-align:left> " + item(resultRelativeCnt, i) + "&#37;" + " </td</tr>"
    end + "
    </tbody>
    <tfoot>
        <tr>
            <th></th>
            <th></th>
            <th style = text-align:right> " + "&#8721; " + format(sum(dataArray), "#,##0.00") + einheit + "</th>
            <th></th>
            <th style = text-align:right>" + "&#8721; " + cnt(dataArray) + " </th>
            <th></th>
        </tr>
    </tfoot>
</table>
";
html(content)

2 Antworten

null
    • Michi.1
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Schönes teil!! Wenn man bestimmte Rechnungsbereiche haben will, muss man nur unter dataArray die Grundlage weiter eingrenzen und schon kommt das detaillierte Ergebnis 👍

    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

Content aside

  • 4 „Gefällt mir“ Klicks
  • vor 1 JahrZuletzt aktiv
  • 2Antworten
  • 142Ansichten
  • 3 Folge bereits