Laden...

Anteile von Werten in Spalte mit Substring

Letzter Beitrag vor 16 Jahren 6 Posts 1.622 Views
Anteile von Werten in Spalte mit Substring

verwendetes Datenbanksystem: Oracle

eigentlich ist es billig, aber ich stehe auf dem Schlauch:

Meine Tabelle sieht ungefähr so aus


spalteA | spalteB |

-------------------

ab1     | 30      | 

ab2     | 20      |

ab3     | 30      |

de1     | 20      |

de2     | 50      |

gh2     | 60      |

gh4     | 70      |


Ich hätte gerne folgendes Ergebnis


Gruppenname | <30 | >50

-------------------------

ab          |0.33 |0

de          |0    |0

gh          |0    |1


D.h. Er soll mir aus der SpalteA Gruppen aus den ersten 2 Zeichen bilden. das geht mit subst(spaltea,1,2). Für jede Gruppe soll er nun berechnen welchen Anteil davon Werte unter 30 und welchen Anteil Werte über 50 haben. Wie würde das Statement lauten? Habs mit Subselects versucht, bekomme das aber nicht hin.

hi 110806

sooooo billig isses ja dann auch wieder nicht.

bei SQL Server / T-SQL funktioniert es so:


SELECT
   substring(spalteA, 1, 2), 
   convert(float, Count(RecordID)) / (select count(RecordID) from myTable where spalteB < 30) as dieEinen,
   convert(float, Count(RecordID)) / (select count(RecordID) from myTable where spalteB > 50) as dieAnderen
FROM
   myTable
GROUP BY
   substring(spalteA, 1, 2)

hth
ron

Hallo citizen.ron, Danke für Deine Antwort.

Da ich gerade keinen Zugriff auf die Oracle-DB habe, habe ich mir eine mysql-Tabelle mit Beispielwerten angelegt. Leider funktioniert Dein Script nicht wie gewünscht, ich konnte es auch nicht entsprechend anpassen.

Problem 1 ist, das er Convert(convert(float, Count(RecordID))) nicht mag. Ich habe dies einmal weggelassen. Meine Vermutung, warum Du in Float convertierst ist, dass er am Ende eine Fliesskommazahl ausgibt. In der MySQL-Referenz habe ich aber kein Beispiel für diese Konvertierung gefunden.

Problem2 ist, dass ich in der Ergebnissspalte einen Bruch haben möchte, d.h. die Summe der Werte in einer Zeile darf maximal 1 sein.

Meine Beispieldatenbank ist etwas anders benannt, Dein Statement lautet übersetzt:


SELECT
   substring(Gruppe, 1, 3), 
   convert(float, Count(Gruppe)) / (select count(Gruppe) from test where cq < 70) as dieEinen,
   convert(float, Count(GRuppe)) / (select count(Gruppe) from test where cq > 50) as dieAnderen
FROM
   test
GROUP BY
   substring(Gruppe, 1, 3);

Hier die Statements, die erzeugt habe, aber das Falsche liefern.


SELECT substring(Gruppe, 1, 3), 
 (select count(Gruppe) from test where cq > 70) as dieEinen / count(Gruppe),   
 (select count(Gruppe) from test where cq < 50)  as dieAnderen / count(GRuppe)
 ,(select count(Gruppe)) as Gesamt
FROM test GROUP BY substring(Gruppe, 1, 3);

SELECT substring(Gruppe, 1, 3), 
((select count(substring(Gruppe, 1, 3)) from test where cq > 70 )/(select count(substring(Gruppe, 1, 3))) as dieEinen,
((select count(substring(Gruppe, 1, 3)) from test where cq < 50 )/(select count(substring(Gruppe, 1, 3)))  as dieAnderen,
(select count(Gruppe)) as Gesamt
FROM test GROUP BY substring(Gruppe, 1, 3);

SELECT
   substring(Gruppe, 1, 3), 
   cast(Count(Gruppe) as float) / (select count(Gruppe) from test where cq < 70) as dieEinen,
   cast(Count(Gruppe) as float) / (select count(Gruppe) from test where cq > 50) as dieAnderen
FROM
   test
GROUP BY
   substring(Gruppe, 1, 3);

Kann es sein, dass ich das gar nicht in der DB berechnet bekomme, sondern in der verarbeitenden anwendung lösen muss?

theoretische müsste ich

die anzahl der mitglieder der gruppen in eine spalte a
die anzahl der mitglieder der gruppen mit bedingung >70 in spalte b
die anzahl der mitglieder der gruppen mit bedingung <50 in spalte c

werfen und dann final
b/a und c/a berechnen.

geht sowas in sql? wenn ja, wie?

Hallo 11.08.2006,

Kann es sein, dass ich das gar nicht in der DB berechnet bekomme, sondern in der verarbeitenden anwendung lösen muss?

Nein, du kannst das schon auch in der DB berechnen. Dafür ist aber wahrscheinlich ein Script notwendig (ähnlich dem von citizen geposteten beispiel). Ich weiss aber nicht, wie das genau in Oracle funktioniert.

Einfacher ist wenn du die Daten von der DB ausliest, und sie dann später in deiner Anwendung bearbeitest.

mfg
MichlG

Hallo,

die db ist erst mal egal, ich teste auch gerade auf einer mysql-db.

ich versuche es nun anders anzugehen:

Wie kann ich bei einer Gruppierung für die aussortierten Gruppen eine 0 ausgeben lassen, anstatt dass die Gruppe im Ergebnis ausgelassen wird? In diesem Beispiel lässt er alle Gruppen weg, die kein mitglied iq>70 aufweisen können.

select substr(Gruppe,1,3),count(Gruppe) from test where cq > 40 group by substring(Gruppe, 1, 3);

statt

B 22
C 12

soll er schreiben:

A 0
B 22
C 12