Führt eine komplexe Abfrage aus, um eindeutige Datensätze basierend auf der Wahrheitstabelle zu zählen

8

Verwenden von Schienen. Ich habe den folgenden Code:

%Vor%

Mit diesen Tabellensätzen:

%Vor%

Ich möchte die Anzahl der eindeutigen Patienten zählen, hängt vom Typ der Blockkombination ab, hier ist das erwartete Ergebnis:

%Vor%

Ich habe versucht, an den Tabellen wie folgt teilzunehmen:

%Vor%

Aber es gibt einfach zu viel Komplexität und die Anzahl ist falsch. Ich wollte Raw-SQL ausprobieren, aber Rails 4 hat es nicht weiter unterstützt und verlangt von mir, dass ich ModelClass.find_by_sql mache.

Wie kann ich die oben erwarteten Ergebnisse generieren?

    
Victor 30.03.2016, 16:45
quelle

3 Antworten

5

Die einzige Lösung, die mir in den Sinn kommt, ist die Verwendung von Raw SQL und die Nutzung der group_concat function , wie hier hier .

Das benötigte SQL ist das:

%Vor%

Die innere Auswahl von Gruppen durch die Patienten und wählt die Kombinationen von Blocktypen, die jeder des Patienten hat. Die äußere Auswahl zählt dann einfach die Patienten in jeder Kombination.

Die Abfrage gibt Folgendes zurück (siehe die SQL-Geige ):

%Vor%

Wie Sie sehen, gibt die Abfrage keine Nullzahl zurück. Dies muss in Ruby-Code gelöst werden (vielleicht wird ein Hash mit allen Kombinationen mit Nullen initialisiert und dann mit den Abfragezählungen zusammengeführt).

Um diese Abfrage in Ruby zu integrieren, verwenden Sie einfach die Methode find_by_sql für jedes Modell (und konvertieren Sie zum Beispiel die Ergebnisse in einen Hash):

%Vor%     
BoraMa 30.03.2016, 19:52
quelle
5

Die Antwort von BoraMa ist korrekt. Ich möchte nur ansprechen:

  

Wie Sie sehen können, gibt die Abfrage keine Nullzählung zurück, muss dies sein   im Ruby-Code gelöst (vielleicht einen Hash mit allen Kombinationen initialisieren)   mit Nullen und fusionieren dann mit der Abfrage zählt).

Es könnte durch Verwendung von reinem MySQL erreicht werden:

%Vor%

SQLFiddleDemo

Ausgabe:

%Vor%

Wie es funktioniert:

  1. Generieren Sie alle möglichen Kombinationen mithilfe der von Serpiton beschriebenen Methode (mit leichten Verbesserungen)
  2. Verfügbare Kombinationen berechnen
  3. Kombinieren Sie beide Ergebnisse

Um besser zu verstehen, wie es funktioniert Postgresql version des Generierens aller Kombinationen:

%Vor%

SqlFiddleDemo2     

lad2025 03.04.2016 21:16
quelle
0

Sie könnten auch nur mit Schienen arbeiten

Erwartet

%Vor%

Abfrage als Beispiel

%Vor%     
devanand 04.04.2016 14:23
quelle

Tags und Links