Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL Abfrage mit geschachtelten Bedingungen/Ausgaben

Begonnen von neni, Oktober 02, 2012, 10:52:59

⏪ vorheriges - nächstes ⏩

neni

Hallo

Ich habe in einer Tabelle "Patient" Patientendaten, 1:n dazu eine Tabelle "Gene" mit etliche SNPs (Mutationen), von welchen ich gerne in einem Bericht ausgeben möchte, bei welchem Patienten welche SNPs noch nicht gefüllt sind (Standardwert="unbekannt"), dies aber variabel nach ihrer Zugehörigkeit zu einer Exon Gruppe (diese Gruppenzugehörigkeit nicht in der DB abgelegt).

z.B.
SNP1 und SNP2 gehören zur Gruppe Exon1
SNP4 und SNP5 und SNP6 gehören zu Gruppe Exon2 etc. (>100 SNPs in 23 Exons)

Sobald ein SNP eines Exons nicht gefüllt ist (also ="unbekannt"), muss im Bericht die Ausgabe des Exons erfolgen. d.H. es müssten mehrere Exons ausgegeben werden, irgendwie müsste man diese Ausgabe zusammenstringen müssen

z.B.
wenn in Patient1 SNP1 oder SNP2 = "unbekannt" -> Berichtausgabe:  Patient1 Exon1 unvollständig
wenn in Patient2 SNP1 und SNP4 = "unbekannt"  -> Berichtausgabe: Patient2 Exon 1/2 unvollständig"
etc.

Ich kenne SQL ein bisschen, aber wie man eine geschachtelte Abfrage macht und v.a. wie man ein Ausgabefeld variabel füllt, da hab ich keinen Plan. Bin für Tips sehr dankbar. Ich bin sicher, dass man das mit SQL machen kann  :D

Liebe Grüsse
neni

DF6GL

Hallo,

so genau versteh ich die Verhältnisse nicht...


"dies aber variabel nach ihrer Zugehörigkeit zu einer Exon Gruppe "


deutet darauf hin, im Bericht nach dieser Gruppe  (dem Feld, das diese Gruppenbezeichnung enthält)  zu gruppieren.


Die Abfrage für den Bericht besteht lediglich aus der Verknüpfung der beiden Tabellen und der Selektion aller Felder aus beiden Tabellen.



"wie man ein Ausgabefeld variabel füllt"

lässt sich im Bericht im Detailbereichs-Ereignis "Beim Formatieren" entspr. Deines Algorithmus für den Zusammenbau des Textes erledigen.


neni

Hallo

Ich versuche nochmal ein Beispiel zu machen.

Tabelle "Gene":
PatID         SNP1             SNP2           SNP3                 SNP4     .....    SNP100
1                1                   2                  1                      2                    unbekannt
2                0                   unbekannt   1                      1                    1
3                unbekannt    2                  unbekannt       unbekannt     unbekannt


Die "Gruppe" ist nirgends abgelegt, wird nur für diesen Bericht gebraucht, aber mir bekannt:
SNP1 und SNP2 gehören zu Exon1.
SNP3 und SNP4 gehören zu Exon2.
SNP100 gehört zu Exon15.  


Im Bericht sollte dann stehen:
Patient       To Do
1                Exon 15,
2                Exon 1,
3                Exon 1, Exon 2, Exon 15


Wie kann ich das Ausgabefeld "To Do" so abfüllen? Ich müsste im Query ja irgendwie die Bedingung setzten können dass wenn SNP1 or SNP2 = unbekannt sind, dass der String "Exon 1," in das "To Do" Feld gesetzt wird und wenn zusätzlich SNP3 = unbekannt ist, müsste in das "To Do" Feld zusätzlich "Exon 2,"  andgehängt werden. Ist dies überhaupt möglich?

ebs17

ZitatIch bin sicher, dass man das mit SQL machen kann
Insbesondere dann, wenn die Datenmodellierung passt: Fahren wird man einen Sportwagen besser auf der Autobahn als in einer Altstadt-Fußgängerzone. Da kommt man zügiger voran und wird sogar noch Sprit sparen.

ZitatPatID         SNP1             SNP2           SNP3                 SNP4     .....    SNP100
Hier sollte ein zusätzlicher Normalisierungsschritt erfolgen.

ZitatDie "Gruppe" ist nirgends abgelegt, ... aber mir bekannt:
Methoden der Gedankenübertragung sind meines Wissens nach noch nicht in Access umgesetzt.
Ich würde eine einfach Zuordnungstabelle verwenden.

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

neni

#4
Besten Dank für die Belehrungen. Ich bin mir dessen durchaus bewusst, habe aber auch meine Gründe, warum dies so und nicht anders Implementiert worden ist. (Kannst du dir auch vorstellen, dass das Beispiel eventuell sehr stark vereinfacht ist, damit es einigermassen Verständlich dargelegt werden kann? Wenn du keine Lust hast, Fragen zu beantworten, dann lass es einfach sein. Solche von oben-herab-gerne-gross-ich-bin-ja-so-der-tollste-hecht-und-ihr-anderen-seid-nur-doof SPAM Antworten helfen nicht wirklich weiter.)

Anyway: Meine Frage bezog sich nicht den korrekten Aufbau meiner Tabelle sondern: WIE KANN ICH innerhalb eines Queries einem Ausgabefeld einen Wert (einen von mir mittels Gedankenübertragung via Finger-Tastatur im Query festgehaltenen String) übergeben?

A la

If Feld1 = "wasauchimmer" or Feld2 = "wasauchimmer"
  move "blablabla" to BERICHTAUSGABEFELD1
end-if


-> dieses IF THEN MOVE TO

compinaut

Hallo,
DF6GL hat es ja bereits geschrieben. Der Code muss im Detailbereich unter "Beim Formatieren".
Z.B.:

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
Dim Exons As String
If SNP1 = "unbekannt" Or SNP2 = "unbekannt" Then
  Exons = Exons & "Exon1"
End if
If SNP3 = "unbekannt" Then
  Exons = Exons & ", " & "Exon2"
End if
...
Feldname = Exons
End Sub


Vielleicht geht das auch kürzer, aber im Prinzip müsste es so gehen.

Gruß
compinaut

Wurliwurm

Zitat von: neni am Oktober 02, 2012, 14:21:33
Solche von oben-herab-gerne-gross-ich-bin-ja-so-der-tollste-hecht-und-ihr-anderen-seid-nur-doof SPAM Antworten helfen nicht wirklich weiter.)

Hier ist es tendentiell so, daß die Fragenden absolut keinen Plan von Datenbankdesign haben. Ist mir auch schon aufgefallen, daß, wenn eine Problemdarstellung wenig handgreiflich rüberkommt, erst mal belehrt wird, die Basics des Datenbankdesigns zu erlernen. Und es belehren hier oft Einäugige die Blinden (wobei der Kollege weiter oben Dir bei einer guten Darstellung sicher weiterhelfen hätte können).

Ich habe das Problem auch nur halb verstanden. Queries und Ausgabefelder sind zwei Paar Stiefel.

Aber grundsätzlich kann man vor dem Erstellen eines Berichts eine Zwischentabelle füllen und dabei VBA verwenden und hast damit Berechnungsvollständigkeit (im Gegensatz zu SQL).

Alternativ kannst Du Code im Print-Ereignis des Berichts verwenden.

Schließlich kannst Du Dir eine Funktion bauen, welche Du in der Abfrage dann verwendest.

neni

 ;D
ja, ich scheine mich sehr schwerz zu tun zu schildern, was genau ich brauche...

Im besagten Bericht wird eine grosse Liste von Ergebnissen von 16 Selects ausgegeben (mit UNION verbunden; aus ca. 20 Tabellen wird allerlei zusammengesucht) -> Abgefüllt in den Detailbereich vom Bericht. Diese Queries sind im Bericht unter "Eigenschaftenblatt" "Daten" "Datensatzquelle"

-> ich hab etwas Datenbankdesign Erfahrung, aber nicht mit Access. VBA: 0 know-how. Daher hab ich sicherlich nicht den praktischten/elegantesten Ansatz und bin auf diese SQL queries versteift.
Der Code von compinaut wäre genau das, was ich bräuchte, nur halt eben als SQL Select, damit ich den an die bestehenden 16 Selects anhängen kann.
Ich nehme an, dass der Code von compinaut nur für ein explizit nur für diesen Code "zuständiges" Feld funktioniert. Meine Felder vom Detailbereich werden aber mit Werten aus all diesen Selects versorgt.

neni

#8
hab ne spur...

Wurliwurm

Zitat von: neni am Oktober 02, 2012, 15:53:09
Der Code von compinaut wäre genau das, was ich bräuchte, nur halt eben als SQL Select, damit ich den an die bestehenden 16 Selects anhängen kann.

Eine Verkettung von 16 Abfragen mittels Union ist zwar etwas ungewöhnlich, aber ist offensichtlich ein gangbarer Weg.

Mir fällt jetzt aber kein Weg ein, eine Konkatenation horizontal nur mit SQL zu machen. Wenn Du meinst, daß das mit SQL geht, dann hast Du vielleicht Funktionen im Kopf, die in SQL eingebaut sind. Eine solche Funktion müsstest Du Dir selberstricken. Ich meine, erst neulich sowas in der Art als Vorschlag in einem anderen Beitrag gesehen zu haben.

Wenn Du kein VBA kannst, dann findest Du bestimmt einen hier, der Dir das codet. Aber Du solltest den Algorithmus darstellen können. Welche Eingabeparameter (Argumente) soll die Funktion haben?

Zum Beispiel könnte ich mir folgende Funktion vorstellen
Public Function getUnbekannteSNP(ByVal patientID as Integer) as String

In der Funktion sollten alle SNP-Spalten durchlaufen werden, welche den Wert "Unbekannt" haben, im Stil von

For i = 0 to rs.Fields(i).count-1
 if rs.Fields(i).Value = "Unbekannt" then
      getUnbekannteSNP = getUnbekannteSNP & ", " & rs.Fields(i).Name
 endif
Next i

Um das zu coden, braucht es eine halbe Stunde und ein Recordset. Am VBA kommst Du da nicht vorbei.

neni

 :) ;) :D ;D

halleluja, habs gefunden!

SELECT Patient.PatID, IIf(Gene.SNP1="unbekannt" Or Gene.SNP2="unbekannt","Exon1, "," ")&IIf(Gene.SNP3="unbekannt" ,"Exon2, "," ")  AS Todo
FROM Patient INNER JOIN GENE ON Patient.PatID = Gene.PatFI;

so einfach, wenn mans weiss  ::)