SQL-Abfrage

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

pasalic
*
Beiträge: 10
Registriert: Mo, 03.12.2012 15:57
Wohnort: Hamburg
Kontaktdaten:

SQL-Abfrage

Beitrag von pasalic »

Hallo,

ich habe ein kleines Problem.
Unzwar möchte ich gerne Datensätze zu einem ganz bestimmten Kriterium ausgeben lassen.
Im Bild sehen Sie einige Datensätze von mir.

test.gif
test.gif (63.08 KiB) 2279 mal betrachtet

Wichtig sind momentan nur diese beiden Spalten:
k-Nr ... ... ... Vernichten?
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA


Ein Datensatz soll nur ausgegeben werden, wenn in Spalte "Vernichten?" JA drin steht (das ist ziehmlich einfach).
Dazu kommt aber noch, dass alle Datensätze die mit k0001 (Kartonnummer) beschriftet sind ausgegeben werden soll.

Beispiel:
k-Nr ... ... ... Vernichten?
k0001 JA
k0001 JA
k0001 Nein
k0001 JA
k0001 JA
(Wenn mindestens ein Datensatz unter "Vernichten?" ein Nein drin stehen hat, soll der ganze Karton bzw alle Datensätze die mit "k0001" beschriftet sind nicht ausgegeben werden auch wenn JA drin steht.

k-Nr ... ... ... Vernichten?
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA
Wenn alle Datensätze in der Spalte "Vernichten?" JA drin stehen haben die zu einem Karton gehören (in diesem Fall "k0001") dann sollen alle diese Daten angezeigt werden.

Ich hoffe es ist deutlich, was ich Suchen. Falls es unklar ist bitte fragen.

Vielen Dank für Ihre Hilfe

MfG
Pasalic
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: SQL-Abfrage

Beitrag von juetho »

Mit einem Beispieldokument - siehe Allgemeine Hinweise zur Forumsbenutzung - könnte gezielt probiert und geantwortet werden. So kann ich nur einen Vorschlag machen, da ich nicht eine Versuchstabelle und Dutzende von Datensätzen erzeugen will. Ausprobieren und ggf. anpassen musst du selbst. Die Lösung ist einer der Fälle für HAVING:

Code: Alles auswählen

SELECT *,
  COUNT(*) as Anzahl,
  COUNT( CASE "Vernichten"
            WHEN "Ja" THEN 1
            ELSE 0
         END ) as ZuVernichten
  FROM ... WHERE ...
  GROUP BY "K-Nr"
  HAVING COUNT(*) = COUNT( CASE "Vernichten"
            WHEN "Ja" THEN 1
            ELSE 0
            END ) 
Leider müssen die Aggregatfunktionen in HAVING wiederholt werden. Ob COUNT mit CASE in dieser Form kombiniert werden kann, habe ich nicht ausprobiert; notfalls geht es mit einer Unterabfrage und JOIN. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
pasalic
*
Beiträge: 10
Registriert: Mo, 03.12.2012 15:57
Wohnort: Hamburg
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von pasalic »

@Juetho - Vielen Dank, dass du dich mit meinem Problem befasst.
Leider bin ich nicht Fit genug in Sachen SQL, deswegen kann ich deine Formel nur teilweise anpassen was aber mit einem Syntax-Fehler zurückgewiesen wird.

Ich habe hier einmal ein Bruchteil meiner Datensätze in eine .odb Datei gesteckt und dir zur Verfügung gestellt. Ich habe die wichtigsten Spalten eingefügt.

Wäre cool, wenn du mir weiterhin mit dieser Sache hilfst. :-)

MfG
Pasalic
Dateianhänge
Besipiel-Datenbank.odb
(8.78 KiB) 231-mal heruntergeladen
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: SQL-Abfrage

Beitrag von juetho »

In der Tat, ich war zu voreilig. Wenn nach "K-Nr" gruppiert werden soll, können keine einzelnen IDs ausgegeben werden. Wir brauchen also eine Unterabfrage: Bestimme zu jeder K-Nr die Anzahl der vorhandenen Einträge und die Anzahl der zu vernichtenden Akten. Hole dann zu jeder K-Nr alle Angaben, sofern die beiden Werte gleich sind - vermutlich über JOIN, wie schon als Möglichkeit angegeben.

Ich werde jetzt die Tabelle der Beispiel-Datenbank ändern: Bisher gibt es nur "NEIN". Wir brauchen aber für einen sinnvollen Test alle Varianten: nur NEIN, nur JA, gemischt. Wenn ich das erledigt habe, kann ich (voraussichtlich morgen Vormittag) mich an die Lösung machen. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von RobertG »

Hallo Pasalic, hallo Jürgen,

ich habe einmal einen Vorschlag angehängt. Gibt mit Sicherheit auch andere Wege, aber mit dem wirft die Abfrage alle raus, die nur noch 'JA' da stehen haben:

Code: Alles auswählen

SELECT DISTINCT "A"."K-Nr", 
     ( SELECT COUNT( "Vernichten" ) FROM "Tabelle1" WHERE "K-Nr" = "A"."K-Nr" AND "Vernichten" = 'JA' ) - 
     ( SELECT COUNT( "Vernichten" ) FROM "Tabelle1" WHERE "K-Nr" = "A"."K-Nr" ) AS "Papierkorb" 
FROM "Tabelle1" AS "A" 
WHERE "Papierkorb" = 0
Gruß

Robert
Dateianhänge
Besipiel-Datenbank.odb
(9.72 KiB) 216-mal heruntergeladen
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: SQL-Abfrage

Beitrag von DPunch »

Servus

Je nachdem, ob Du nur die K-Nr brauchst, oder aber den gesamten Datensatz, funktioniert das prinzipiell so:

Code: Alles auswählen

SELECT "K-Nr" FROM "meineTabelle" 
		GROUP BY "K-Nr" HAVING SUM(CASE WHEN "Vernichten" = 'JA' THEN 1 ELSE 0 END)-SUM(1) = 0
oder so

Code: Alles auswählen

SELECT * FROM "meineTabelle" WHERE "K-Nr" IN 
	(SELECT "K-Nr" FROM "meineTabelle" 
		GROUP BY "K-Nr" HAVING SUM(CASE WHEN "Vernichten" = 'JA' THEN 1 ELSE 0 END)-SUM(1) = 0)
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: SQL-Abfrage

Beitrag von juetho »

Mein endgültiger Vorschlag, den ich mir heute im Halbschlaf entwickelte, entspricht vollständig demjenigen von DPunch.

Ergänzend schlage ich noch vor, die Tabellendefinition zu ändern. Für eine Spalte, die nur die Werte JA/NEIN enthält, ist der Datentyp BOOLEAN besser geeignet. Diese hat zusätzlich den Vorteil, dass in der Summenformel der Vernichten-Wert direkt übernommen werden kann (ohne CASE).

Damit die bisherigen Inhalte erhalten bleiben, musst du dafür schrittweise vorgehen:
  • Erzeuge eine neue Spalte temp char(4).
  • Kopiere die bisherigen Werte dorthin: update tabelle1 set temp = vernichten;
  • Ändere den Datentyp der Spalte vernichten auf BOOLEAN.
  • Setze die Feldinhalte neu: update tabelle1 set vernichten = case temp when ... end case (analog zur Summenformel).
Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
pasalic
*
Beiträge: 10
Registriert: Mo, 03.12.2012 15:57
Wohnort: Hamburg
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von pasalic »

DPunch hat geschrieben:

Code: Alles auswählen

SELECT * FROM "meineTabelle" WHERE "K-Nr" IN 
	(SELECT "K-Nr" FROM "meineTabelle" 
		GROUP BY "K-Nr" HAVING SUM(CASE WHEN "Vernichten" = 'JA' THEN 1 ELSE 0 END)-SUM(1) = 0)
Vielen Herzlichen Dank DPunch und auch an die anderen für die Schnelle und präzise Hilfe. Sehr Nett.
Super Forum hier.



Was noch cool wäre ist, wenn Ihr mir sagen würdet, wie man Datensätze Gruppiert.
Also ich habe ja pro Kartonnummer (K-Nr) meistens um die 7 bis 8 Datensätze.
Ich möchte gerne, dass wenn das vorkommt nur ein Datensatz angezeigt wird.


Beispiel:
So ist es momentan:
K-Nr Vernichten?
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA
k0001 JA

So soll es sein:
K-Nr Beschriftung.
k0001 JA
k0002 JA
usw....


MfG
Pasalic
Zuletzt geändert von pasalic am Mo, 10.12.2012 12:23, insgesamt 1-mal geändert.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: SQL-Abfrage

Beitrag von juetho »

Das liefert dir der erste Vorschlag von DPunch. Da wird zwar das JA nicht angezeigt, aber das Ergebnis umfasst sowieso genau diejenigen Kartons, die zu vernichten sind; also gibt es keine anderen Kartons in der Ergebnismenge.

Nebenbei: Du musst ja einen sehr großen Bildschirm haben, dass du den Dank und die ergänzende Frage so groß darstellen kannst. Hier gibt es aber auch Helfer mit Smartphones u.ä.; bei denen sind solche Darstellungen eher lästig.

Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
pasalic
*
Beiträge: 10
Registriert: Mo, 03.12.2012 15:57
Wohnort: Hamburg
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von pasalic »

juetho hat geschrieben:Das liefert dir der erste Vorschlag von DPunch. Da wird zwar das JA nicht angezeigt, aber das Ergebnis umfasst sowieso genau diejenigen Kartons, die zu vernichten sind; also gibt es keine anderen Kartons in der Ergebnismenge.

Nebenbei: Du musst ja einen sehr großen Bildschirm haben, dass du den Dank und die ergänzende Frage so groß darstellen kannst. Hier gibt es aber auch Helfer mit Smartphones u.ä.; bei denen sind solche Darstellungen eher lästig.

Jürgen
Ich probiere es mal.

Hahahaha das tut mir leid.

Danke nochmal :-)

MfG
Pasalic
Antworten