SDQ (Care Module)
Strengths and Difficulties Questionnaire — template, student list, and scored results nested on Student
SDQ
The Strengths and Difficulties Questionnaire (SDQ) is a 25-item screening tool scored across five dimensions. Three respondents fill it out per student: TEACHER, PARENT, and STUDENT. All queries require authentication and are scoped to your school.
The SDQ surface is read-only — this API exposes only template, student list, and scored result queries. Answers are captured through the care application.
Respondent Types
RespondentType is a GraphQL enum with three values:
| Value | Description |
|---|---|
TEACHER | Homeroom or advising teacher |
PARENT | Parent or guardian |
STUDENT | Student self-assessment |
Scoring Dimensions
| # | Dimension | Questions | Risk threshold |
|---|---|---|---|
| 1 | EMOTIONAL | 3, 8, 13, 16, 24 | 6 |
| 2 | CONDUCT | 5, 7, 12, 18, 22 | 5 |
| 3 | HYPERACTIVITY | 2, 10, 15, 21, 25 | 6 |
| 4 | PEER | 6, 11, 14, 19, 23 | 4 |
| 5 | PROSOCIAL | 1, 4, 9, 17, 20 | strength if > 3 |
For dimensions 1–4: score > threshold → PROBLEM, score == threshold → RISK, otherwise NORMAL. Each dimension returns NOT_ASSESSED until all five of its questions are answered.
For PROSOCIAL: score > 3 → STRENGTH, else NO_STRENGTH (Prosocial is inverted — a high score is a strength, not a risk).
Total score = sum of dimensions 1–4 only (Prosocial is excluded from the total).
| Answered | Total score | Level |
|---|---|---|
| 0 | — | NOT_ASSESSED (ยังไม่ประเมิน) |
| 1 – 19 | — | PARTIAL (ประเมินยังไม่ครบ) |
| 20 + | > 18 | PROBLEM |
| 20 + | 17 – 18 | RISK |
| 20 + | < 17 | NORMAL |
Get SDQ Template
Return the template, all 25 questions in order, and the answer choices for each question. Response is cached in-memory for 60 minutes.
query {
sdqTemplate {
id
name
questions {
id
orderNumber
questionText
answers {
id
answerText
answerPoint
}
}
}
}List Students with Completion Status
Return students in your school with per-respondent completion counts. Defaults to the active academic year when no academicYearId or semesterId is provided.
query {
sdqStudents(classroomId: 42, status: "progress", limit: 50) {
studentId
code
title
firstname
lastname
classroomName
orderNumber
teacherDone
parentDone
studentDone
teacherAnswered
parentAnswered
studentAnsweredCount
}
}Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
academicYearId | Int | active year | Scope results to a specific academic year |
semesterId | Int | — | Scope results to a single semester (overrides academicYearId) |
classroomId | Int | — | Filter to one classroom |
status | String | all | completed | progress | not_started | all |
limit | Int | 50 | Maximum number of rows |
offset | Int | 0 | Number of rows to skip |
Status Filter Semantics
| Value | Matches |
|---|---|
completed | All three respondents have answered every question |
progress | At least one respondent started but not all three are complete |
not_started | No respondent has answered any question |
all (or omitted) | Every student in scope |
Get Scored Result
SDQ scores are exposed as a nested field on Student. Use the top-level student(id) query (which is school-scoped) and select the sdq field. This returns one entry per respondent (TEACHER, PARENT, STUDENT) in a single call.
# Defaults to the active semester for the caller's school
query {
student(id: 12345) {
id
fullName
classroomName
sdq {
respondent
totalScore
totalAnswered
totalLevel
totalLevelText # e.g. "ปกติ"
dimensions {
name
nameText # e.g. "ด้านอารมณ์"
score
answeredCount
level
levelText # e.g. "ปกติ" / "เสี่ยง" / "มีปัญหา" / "มีจุดแข็ง"
}
}
}
}Pass semesterId explicitly to score a different semester:
query {
student(id: 12345) {
sdq(semesterId: 78) {
respondent
totalLevel
totalScore
}
}
}Student.sdq
| Argument | Type | Description |
|---|---|---|
semesterId | Int | Optional. When omitted, the active semester for the caller school is used. |
Returns [SdqRespondentResult!]! — always three entries, one for each respondent. Respondents with no answers appear with totalLevel: NOT_ASSESSED; respondents who answered some but fewer than 20 questions appear with totalLevel: PARTIAL.
Example: Combined list + nested SDQ
Because sdq is a field on Student, you can fetch scores for many students in one round-trip by nesting it under students():
query {
students(limit: 5, search: "ณัฏฐรินทร์") {
id
fullName
classroomName
sdq(semesterId: 1448) {
respondent
totalLevel
totalScore
}
}
}SdqRespondentResult
| Field | Type | Description |
|---|---|---|
respondent | RespondentType | TEACHER, PARENT, or STUDENT |
totalScore | Float | Sum of dimensions 1–4 |
totalAnswered | Int | Count of answered questions across dimensions 1–4 |
totalLevel | SdqLevel | NORMAL | RISK | PROBLEM | PARTIAL | NOT_ASSESSED |
totalLevelText | String | Thai label for totalLevel (e.g. ปกติ, เสี่ยง, มีปัญหา, ยังไม่ประเมิน) |
dimensions | [SdqDimension] | Five entries: EMOTIONAL, CONDUCT, HYPERACTIVITY, PEER, PROSOCIAL |
SdqDimension
| Field | Type | Description |
|---|---|---|
name | SdqDimensionName | EMOTIONAL | CONDUCT | HYPERACTIVITY | PEER | PROSOCIAL |
nameText | String | Thai dimension name (e.g. ด้านอารมณ์, ด้านความประพฤติเกเร) |
score | Float | Raw score for this dimension |
answeredCount | Int | Number of answered questions in this dimension (0 – 5) |
level | SdqLevel | Level for this dimension. PROSOCIAL uses STRENGTH / NO_STRENGTH / NOT_ASSESSED |
levelText | String | Thai label for level (e.g. ปกติ, เสี่ยง, มีปัญหา, มีจุดแข็ง, ไม่มีจุดแข็ง, ยังไม่ประเมิน) |
Errors
All queries return a GraphQL error with these codes when validation fails:
| Code | Cause |
|---|---|
UNAUTHENTICATED | No valid JWT or API key |
FORBIDDEN | JWT has no schoolId |
NOT_FOUND | studentId does not belong to your school, SDQ template is missing, or no active semester found when semesterId is omitted |