2017-08-09 4 views
2

eine Tabelle wie so Gegeben:Zählen unterschiedliche Werte innerhalb der Gruppe

| JobId | Result | 
|-------|--------| 
| 1  | true | 
| 1  | false | 
| 1  | true | 
| 1  |  | 
| 2  | false | 
| 2  | false | 
| 1  | true | 
| 1  | true | 
| 1  | true | 

Ist es möglich, dass eine SQL-Abfrage eine Ausgabe wie folgt zu generieren?

[{JobId: 1, true: 2, false: 1, undefined: 1}, 
{JobId: 2, true: 3, false: 2, undefined: 0}] 

ich derzeit die ORM Sequelize verwende, aber rohe Abfragen verwenden können, ist das, was ich bis jetzt haben.

db.JobResponse.findAll({ 
    where: { 
     jobId: job 
    }, 
    attributes: ['JobId', [fn('sum', col('result'))]], 
    group: ['JobId'] 
}).then(result => { 
    res.status(200).send({ 
     data: result 
    }); 
}) 

Derzeit ist es zu sum die result Spalt, die Gruppierung von JobId versucht, jedoch ist das Ergebnis ein boolean (Erwartungswert ist wahr, falsch und nicht definiert), so dass eine einfache Summe wird nicht funktionieren. Ist es möglich, pro eindeutigen Wert innerhalb einer Gruppe zu zählen?

Antwort

3

Ich denke, eine grundlegende Pivot-Abfrage die wahr, falsch und nicht definierten Zählungen zusammen mit FOR JSON AUTO am Ende der Abfrage aggregieren sollte das gewünschte Ergebnis erzeugen:

SELECT 
    JobId, 
    SUM(CASE WHEN Result = 'true' THEN 1 ELSE 0 END) AS true, 
    SUM(CASE WHEN Result = 'false' THEN 1 ELSE 0 END) AS false, 
    SUM(CASE WHEN Result IS NULL THEN 1 ELSE 0 END) AS undefined 
FROM yourTable 
GROUP BY JobId 
FOR JSON AUTO; -- convert each result record to a JSON element inside an outer array [] 

ich das nicht wirklich testen konnte , da sowohl Rextester als auch SQLFiddle die SQL Server-JSON-Erweiterungen nicht zu unterstützen scheinen. Aber this useful tutorial scheint die Antwort zu unterstützen, die ich gab.

+0

hmmm, das scheint so zu funktionieren, dass, wenn ich kein "wahres" Ergebnis habe, die Abfrage 0 zurückgibt und wenn ich 1 'true' Ergebnis habe, zählt die Abfrage 1. Wenn I Habe 2 'true' Ergebnisse, die Abfrage gibt immernoch nur 1 zurück ... Ich bekomme eine Antwort wie' {data: [{JobId: 1, true: 1, false: 0, undefined: 1}]} ' –

+0

Ich weiß nicht Ich sehe kein Problem mit meiner Anfrage. Vielleicht stimmt etwas nicht mit Ihren Daten. –

+0

Ich glaube nicht. Ich bin Unit-Test einen API-Endpunkt, die Tests verwenden SQLite (also verwende ich nicht die endgültige JSON-Zeile). Wie gesagt, es werden 0 und 1 korrekt, aber wenn ich das 'true' Ergebnis in meinen SQLite JSON Seed kopiere und einfüge, bekomme ich nur eine Anzahl von 1? –

Verwandte Themen