# Die Daten hinter einer Umfrage (/docs/de/survey-apps/survey-data)



Die Antworten einer Umfrage sind gewöhnliche Daten in Ihrem Workspace. Factophant hält
sie in einer kleinen Gruppe von Tabellen, die es für Sie anlegt und pflegt, und genau
diese Tabellen liest die Seite Ergebnisse, schreibt der CSV-Export und importiert eine
Analyse-App.

## Die Seite Pipeline [#die-seite-pipeline]

Die Seite **Pipeline** im Editor zeigt diese Tabellen als Pipeline, nur lesbar. Jeder
Knoten darauf wird von Factophant erzeugt und mit Ihrem Formular abgeglichen: Es gibt
nichts hinzuzufügen, zu bearbeiten oder auszuführen. Eine neue Umfrage hat ihre ganze
Pipeline von Anfang an, leer bis zur ersten Antwort.

Zwei Arten von Knoten liegen darauf:

* **Umfragedaten** - die drei Tabellen, in die Antworten geschrieben werden. Öffnen Sie
  eine, um ihre Spalten und deren Typen im Tab Konfiguration und die Zeilen im Tab
  Daten zu sehen.
* **Umfrageansicht** - Auswertungen über diese Tabellen, live berechnet, wann immer sie
  gelesen werden. Öffnen Sie eine, um die Anweisung dahinter zu sehen; die Zeilen stehen
  im Tab Daten. Ihr **Ausführen** ist nicht verfügbar, weil eine Ansicht nie ausgeführt
  werden muss.

Die Knoten tragen englische Namen, in jeder Sprache dieselben.

### Die drei gespeicherten Tabellen [#die-drei-gespeicherten-tabellen]

| Knoten          | Eine Zeile pro                                                                                        | Was sie enthält                                                                                                                                                                                          |
| --------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Questions**   | Seite, Frage, Option und Tabellenspalte, für jede veröffentlichte Version, die jemand beantwortet hat | Das Formular als Daten: `node_id`, `kind` (`section`, `question`, `option` oder `field`), `parent_id`, `label`, `question_type`, `is_required`, `is_archived`, die Bedingung und `structure_version_id`. |
| **Answers**     | einzelne Angabe                                                                                       | `response_id`, `question_id` und die Angabe in genau einer der Spalten `option_id`, `value_text`, `value_number`, `value_boolean` oder `value_date`, mit `structure_version_id`.                         |
| **Submissions** | Antwort                                                                                               | `response_id`, `submitted_at` (UTC), `structure_version_id` und `deleted_at`, gesetzt, wenn die Antwort gelöscht wurde.                                                                                  |

Ein paar Dinge über **Answers** sollten Sie kennen, bevor Sie sie abfragen:

* `question_id` ist der **Spaltenname** der Frage, angezeigt in ihrer Gruppe
  [Antwort-Datensatz](./build-the-form.mdx#where-each-answer-is-stored).
* Eine **Mehrfachauswahl** ist eine Zeile je gewählter Option, sodass das Zählen einer
  Option ein einfaches Gruppieren ist.
* Eine Antwort **Sonstiges** ist eine Zeile mit der Options-ID `__other__` und dem
  eingegebenen Text in `value_text`.
* Eine **Tabellenantwort** ist eine Zeile je ausgefüllter Zelle: `repeat_index` ist die
  Zeile (ab 0) und `field_id` die Spalte.
* Eine **Dateiantwort** ist eine Zeile, deren `value_text` die Datei beschreibt,
  einschließlich ihres `name`.
* Eine Frage, die jemandem nie angezeigt wurde, und eine leer gelassene freiwillige Frage
  hinterlassen beide keine Zeile.

**Questions** wird geschrieben, wenn eine veröffentlichte Version ihre erste Antwort
erhält, nicht beim Veröffentlichen - so lässt sich jede Antwort immer auf den genauen
Wortlaut zurückführen, den die Person gesehen hat.

### Die sechs Ansichten [#die-sechs-ansichten]

| Knoten               | Was er zeigt                                                                                                                                            |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Current form**     | Jede Frage in ihrer neuesten beantworteten Version.                                                                                                     |
| **Question changes** | Für jede Frage und beantwortete Version, was sich geändert hat und welche Versionen zusammen gezählt werden dürfen.                                     |
| **Labelled answers** | Jede Angabe mit Frage und Option in Ihren Worten ausgeschrieben, markiert, wo die Frage inzwischen neu definiert wurde.                                 |
| **Option counts**    | Wie viele Antworten jede Option gewählt haben, einschließlich der Optionen, die niemand gewählt hat.                                                    |
| **Responses**        | Eine Zeile pro Antwort und eine Spalte pro Frage - was die Tabelle Einzeln und der CSV-Export lesen.                                                    |
| **Crossed answers**  | Jede Angabe mit den eigenen Antworten der Person auf die ersten Einfachauswahl-Fragen daneben, sodass sich eine Frage nach einer anderen filtern lässt. |

Die Ansichten, die Antworten lesen, lassen gelöschte Antworten weg.

## Die Antworten in einer Analyse-App verwenden [#using-the-answers-in-an-analysis-app]

Eine Umfrage-App sammelt Antworten; sie verarbeitet sie nicht. Wenn Sie die Antworten
mit einem anderen Datensatz verbinden, nach Ihren eigenen Vorstellungen darstellen, die
Antworten einer Gruppe Frage für Frage lesen oder in einen Bericht einspeisen möchten,
holen Sie sie in eine Analyse-App - dort leben Transformationen und Läufe.

Genau das tut ein [Analyse-App-Daten-Knoten](../analytical-apps/pipeline/analytic-data.mdx):

1. Fügen Sie im Editor der Analyse-App einen Knoten **Analyse-App-Daten** hinzu.
2. Wählen Sie die Umfrage als **Quell-Analyse-App*&#x2A;. Die Liste führt jede Umfrage neben
   Ihren Analyse-Apps auf, gekennzeichnet mit &#x2A;(Umfrage)&#x2A;; eine nie veröffentlichte
   Umfrage ist mit &#x2A;(Umfrage - noch nicht veröffentlicht)* gekennzeichnet und lässt sich
   nicht wählen, weil es nichts zu importieren gibt.
3. Wählen Sie den **Quellknoten**. Eine Umfrage bietet ihre drei gespeicherten Tabellen
   an, benannt nach der Umfrage: `- questions`, `- answers` und `- responses`, wobei
   die letzte die Tabelle **Submissions** ist. Die Ansichten lassen sich nicht
   importieren. Legen Sie je benötigter Tabelle einen Knoten an; die meisten Analysen
   nutzen alle drei.
4. Wählen Sie optional, welche **Spalten** importiert werden; mit **Alle Spalten** kommt
   jede mit.

Wie jeder von Hand hinzugefügte Knoten landet der Import im **Entwurf** der Analyse-App.
Dabei wird nichts veröffentlicht und nichts ausgeführt: Führen Sie die Pipeline aus, um
die Antworten hindurchfließen zu sehen, und veröffentlichen Sie, wenn das Ergebnis
stimmt.

Eine Umfrage hat keine eigenen Läufe; jeder Lauf der Analyse-App liest die Tabellen der
Umfrage daher **so, wie sie in diesem Moment sind**, und behält diese Kopie in seinem
eigenen Verlauf. Neue Antworten erreichen die Analyse-App bei ihrem nächsten Lauf.

### Die importierten Tabellen lesen [#die-importierten-tabellen-lesen]

Die Antworten kommen als eine Zeile pro Angabe an, was jeden Fragetyp und jede Version
des Formulars in einer Form hält. Ein SQL-Knoten setzt sie wieder zusammen. Verbinden
Sie **answers** mit **questions** für den Wortlaut und mit **submissions** für den
Zeitpunkt - und behalten Sie nur die Einreichungen, deren `deleted_at` leer ist, damit
eine in der Umfrage gelöschte Antwort aus Ihren Ergebnissen herausbleibt.

Mit Importknoten namens `commute_answers`, `commute_questions` und
`commute_submissions` zählt diese Abfrage, wie viele Personen jede Antwort auf eine
Frage gewählt haben:

```sql title="commute_mode_counts.sql"
SELECT q.label AS mode,
       COUNT(*) AS respondents
  FROM commute_answers a
  JOIN commute_submissions s
    ON s.response_id = a.response_id
  JOIN commute_questions q
    ON q.kind = 'option'
   AND q.parent_id = a.question_id
   AND q.node_id = a.option_id
   AND q.structure_version_id = a.structure_version_id
 WHERE a.question_id = 'how_do_you_get_to_work'
   AND s.deleted_at IS NULL
 GROUP BY q.label
```

Eine Antwort **Sonstiges** hat keine Optionszeile, daher lässt diese Abfrage sie weg;
lesen Sie sie aus `value_text`, wo `option_id` gleich `__other__` ist. Nichts davon
müssen Sie selbst schreiben: Beschreiben Sie Vera das gewünschte Ergebnis, und Vera
schreibt den SQL-Knoten. Siehe [SQL-Knoten](../analytical-apps/pipeline/sql-nodes.mdx).

Es gelten die üblichen Regeln für Importe - wer welche App importieren darf und was ein
Import daran ändert, wer die importierende App ändern kann. Siehe
[Analyse-App-Daten](../analytical-apps/pipeline/analytic-data.mdx).
