Zum Inhalt springen

Datenanalyse mit MySQL


etops

Empfohlene Beiträge

Hallo,

ich habe die Aufgabe, mittels PHP die Daten einer MySQL-Tabelle auszulesen. Das hört sich zunächst recht simpel an, allerdings bin ich bereits über einige Fallen gestolpert, bei denen ich noch nicht so recht einen Lösungsansatz gefunden habe. Vielleicht hat ja jemand von Euch einen Rat?

Konkret sieht die Tabelle so aus:

Datum | VAW1 | VAW2 | VAW3 | ... | VAW10

In den Spalten VAW1 - VAW10 steht jeweils eine Zahl zwischen 0 und 99, bestimmte Zahlen gehören zu einer Gruppe (manchmal ein geschlossener Bereich, z.B. 41-49, manchmal verstreute Zahlen, z.B. 21,24,37,52, etc).

Ich soll nun auswerten, wie oft die Werte einer Gruppe (die entsprechend in jedem Feld von VAW1 bis VAW10 enthalten sein können) im Zeitraum X vorgekommen sind.

Der erste Ansatz war mit SELECT COUNT aber das wollte nicht gut funktionieren.

Hat jemand eine zündende Idee, wie ich das evtl einfacher oder schneller hinkriegen kann? Das wäre super :)

Danke + Gruß

etops

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

wie hast du deine Tabellen für die Gruppen aufgebaut?

z.B. Gruppe1 --> Feld Zahlen --> Einträge:

40

41

...

49

oder eher so:

Gruppe1 --> Felder: von, bis -->einträge:

40 49

?

Die 2 Frage wäre, willst du die Anzahl der Datensätze wissen die in Werte aus der Gruppe enthalten (also egal in welcher Spalte 1-10) -->

ein DS wird nur 1mal gezählt, auch wenn der Wert in Spalte 1 + 3 + 5 in der Gruppe enthalten ist.

Oder

soll dann Gezählt werden wie oft der Wert in der Ganzen Tabelle enthalten ist.-->

z.B.

Es sind 104 Einträge der Gruppe1 zuzuordnen.

oder willst du dies auch Spaltenspeziefisch lösen

z.B. IN der Spalte VAW 1 sind 43 Einträge aus der Gruppe1 enthalten...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Mr Database (welch passender Name ;) ),

der mittlere Ansatz ist der richtige, d.h. ich möchte wissen, wie oft die Werte einer bestimmten Gruppe in den bestimmten Feldern vorkommen (z.B. Werte der Gruppe XY kamen in den Spalten bla1 bis bla4 137 mal vor). Alternativ muß ich nicht unbedingt sofort nach Gruppen aufteilen sondern es würde auch gehen, daß ich einfach herauskriege, daß die Werte 41, 37, 59, 64, 81 und 12 insgesamt in diesen Feldern 635mal aufgetaucht sind.

Bisher ist die Tabelle so aufgebaut, daß ich 10 Spalten habe, in denen die entsprechenden Werte drinstehen - eben 0 bis 99.

Danke für weitere Hilfe

-etops-

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde ja gerne normalisieren oder dieses und jenes zwischendurch mit der Tabelle machen - nur leider hat die Tabelle noch andere Felder (die jeden Datensatz eindeutig machen) die aber hierfür nicht relevant sind.

Irgendwie muß das doch auszuwerten sein...

Was ist der Grund, daß man SELECT COUNT nicht mit UNION verbinden kann...es muß doch gehen, mit Ergebnissen solcher Abfragen weiterrechnen zu können?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von etops

Ich würde ja gerne normalisieren oder dieses und jenes zwischendurch mit der Tabelle machen - nur leider hat die Tabelle noch andere Felder (die jeden Datensatz eindeutig machen) die aber hierfür nicht relevant sind.

Das ist imho irrelevant!

Was machst du z.B. wenn dein Chef kommt und sagt wir brauchen aber noch VAW11.

Dann musst du die Datenbank ändern, den Code ändern, kompilieren, neue Version ausliefern usw. usw.

Also Tabelle für die VAWs und Tabelle für die IDs oder Gruppen erstellen und entsprechend verknüpfen.

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Jaraz

1. Es steht die Frage, warum diese Tabelle in die 5.NF gehoben werden sollte.

Wenn die Bedingung lautet, einen Select über die Tabelle laufen zu lassen, und dieser sich als komplex erweist, ist es natürlich schön, wenn man ändern und den aktuellen Wünschen entsprechend anpassen kann, aber es ist mindestens ebenso fraglich, ob eine Änderung á là "... was wäre, wenn ..." wirklich erfolgsversprechend ist.

Nebenfrage: "Was wäre, wenn diese Tabelle Teil einer OLAP-Anwendung ist?" Dann wäre Normalisierung schlicht "tödlich", weil nervenaufreibende Optimierungsvorgänge stattfinden müssen, die man mit so simplen Dingen, wie einer "schlichten" Normalisierung vermeiden kann.

2. Ist die Diskussion eines "Was wäre, wenn..." ganz sicher nicht im Sinne der Aufgabe, oder? ;)

@etops

Ich vermute, dass du mit einer einfachen Abfrage nicht allzu weit kommen wirst.

Allerdings ist mir keine Situation geläufig, in der UNION nicht mit einem SELECT COUNT kooperieren würde.

Eine mögliche Alternative ist es, über alle Spalten separate, evtl. nach Gruppen aufgelöste, SELECTs laufen zu lassen, und die Ergebnisse dann mit array_merge zu mischen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also muss erstmal zustimmen:

am besten wäre es die Tabelle zu normalisieren:

Es gibt jedoch auch eine Lösung über sql, jedoch ist diese Extrem umständlich und lang, da ist es wohl wirklich besser, das ganze über den PHP Code abzufragen:

Hier trotzdem die SQL Lösung:

select sum(anzahl) as vorkommnis from

( select count(*) as anzahl from eintraege

where VWA1 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA2 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA3 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA4 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA5 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA6 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA7 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA8 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA9 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

union all

select count(*) as anzahl from eintraege

where VWA10 in (select zahl from gruppe1)

and eintraege.datum < #01/01/2004#

and eintraege.datum > #01/01/2001#

)

;

Dabei gehe ich davon aus dass die Tabelle mit den Spalten VWA ... eintraege heißt, und die Tabelle mit den Zahlen einer Gruppe gruppe1 (spalte zahl) heißt.

Dies könnte man bei mehrern Gruppen natürlich auch in einer Tabelle zusammenfassen!

Wenn du an der DB nichts extrem ändern willst würde ich dir raten, das ganze wirklich über einfache selects in PHP zu realisieren!

Ich hoffe dass hilft dir etwas weiter!

Gruß

Mr. Database

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...