Brauche ein bisschen Hilfe bei SQL

Raygin

Semiprofi
Thread Starter
Mitglied seit
05.02.2008
Beiträge
1.727
Ort
Braunschweig
Hey Leute,

ich brauche bei einer SQL-Abfrage ein bisschen Hilfe, ich komm einfach nicht drauf.

Folgenden Query habe ich bereits, der funktioniert auch:

SELECT *
FROM
(SELECT
rueckgabestation
, count(*) AS anzahl
FROM
station_1020
GROUP BY
rueckgabestation
ORDER BY
anzahl desc
) AS subq

Dieser erstellt mir eine Tabelle mit zwei Spalten, links eine Liste der Rueckgabestationen und rechts die Anzahl, wie oft diese benutzt wurden. Jetzt hätte ich gerne noch eine dritte Spalte daneben, die mir den Anteil in Prozent angibt. Also die Anzahl nochmal summiert und dann für jede Spalte (Anzahl / Summe * 100), bekomme es aber einfach nicht hin. Wenn ich in dem äußeren Query so etwas mache

SELECT *
, (sum(anzahl) / anzahl * 100) as anteil

bekomme ich a) die Fehlermeldung, dass die beiden Spalten des Subqueries gegrouped werden müssen und wenn ich das mache, bekomme ich in der Spalte anteil überall hundert raus, weil (sum(anzahl) / anzahl) stets 1 ist.

Vielleicht gibt es hier einen findigen SQL-Versteher, der einen Anstoß geben kann? Mein SQL ist leider so ein bisschen eingerostet :-(

Viele Grüße
Raygin
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hi,

warum hast du da einen Subquery fuer drin? Den brauchst du doch garnicht?

Eigtl sollte folgendes tun:

SELECT
rueckgabestation
, count(*) AS anzahl
, (sum(anzahl) / anzahl * 100) as anteil
FROM
station_1020
GROUP BY
rueckgabestation
ORDER BY
anzahl desc
 
Hi,

danke schonmal für die Hilfe. Postgre gibt mir bei deinem Vorschlag die Fehlermeldung

FEHLER: Spalte »anzahl« existiert nicht
LINE 4: , (sum(anzahl) / anzahl * 100) as anteil

Weil die Spalte Anzahl in der Tabelle station_1020 nicht existiert, dachte ich man müsse das über einen Subquery lösen, um darauf eine Funktion anzuwenden.


edit: ich "darf" jetzt erstmal 4 Stunden Zug fahren, bis dahin kann ich also leider hier nicht mehr reinschauen, freue mich aber über alle weiteren Tipps und Vorschläge ;)
 
Zuletzt bearbeitet:
keiner mehr einen Hinweis, der sich besser auskennt als ich? Nuja, ich probiers weiter mittels trial & error ^^
 
SELECT
rueckgabestation
, count(*) AS anzahl
, (sum(count(*)) / count(*) * 100) as anteil
FROM
station_1020
GROUP BY
rueckgabestation
ORDER BY
anzahl desc
 
heyho, danke, dass sich noch jemand gemeldet hat :) Ich hab jetzt zwar eine Lösung, die ist allerdings recht umständlich und daher etwas unbefriedigend. Ich hab einfach noch ein paar mehr Tabellen erstellt, aus denen ich die Anteile bekomme, ist aber leider nicht gerade optimal so.

Deine Lösung little_skunk gibt mir leider den Fehler
FEHLER: Aufrufe von Aggregatfunktionen können nicht geschachtelt werden
LINE 4: , (sum(count(*)) / count(*) * 100) as anteil

Ich bin mir nicht mehr 100% sicher, weil das schon ne Weile her ist, aber ich glaube mit Netbeans konnte man solche Schachtelungen machen und auch sowas wie Nascar vorgeschlagen hatte ging da...keine Ahnung wieso Postgre da so zickig ist ^^
Danke trotzdem :)
 
Was willst du überhaupt berechnen :d

Versuch mal folgendes:

Select Anzahl/gesammt as Prozentanteil from ?, (Select sum(anzahl) as gesammt from ?)
 
Zuletzt bearbeitet:
werde ich morgen mal testen, heute bin ich nicht zu hause. Vielen Dank schonmal :) Nunja, es soll in einer Spalte aus verschiedenen bestimmten Tupel summiert werden und diese dann sortiert. Das gibt dann untereinander sowas wie 14020, 9402, 4203 etc. Daneben hätte ich gerne eine Spalte mit den Prozentangaben, also wenn das Beispiel alle Werte sind (sind sie nicht, insgesamt sind es immer zwischen 60 und 70), wäre das dann 14020/ (14020 + 9402 + 4203). In einem einzigen query wäre optimal, jetzt habe ich es halt so gemacht, dass ich mir neue Tabellen mit den Absolutwerden angelegt habe und kann jetzt die entsprechende Abfrage machen, die mir die Prozente liefert. Aber wie gesagt, das ist nicht optimal, weil ich so wohl noch einige 100 Tabellen erstellen müsste -.-'
 
Sowas ?

CREATE TABLE stations (
id serial,
title TEXT,
PRIMARY KEY(id)
);

CREATE TABLE usages (
id serial,
station integer REFERENCES stations(id),
PRIMARY KEY(id)
);

INSERT INTO stations (title) VALUES ('station_1');
INSERT INTO stations (title) VALUES ('station_2');
INSERT INTO stations (title) VALUES ('station_3');

INSERT INTO usages (station) VALUES (1);
INSERT INTO usages (station) VALUES (1);
INSERT INTO usages (station) VALUES (1);
INSERT INTO usages (station) VALUES (2);
INSERT INTO usages (station) VALUES (2);
INSERT INTO usages (station) VALUES (3);

SELECT s.title AS title, COUNT(s.title) AS count, COUNT(s.title) :: double precision/(SELECT COUNT(*) FROM usages) AS percent
FROM stations s, usages u
WHERE s.id = u.station
GROUP BY title
 
vielen Dank, ich werd nachher mal schauen, wie ich das sinnvoll umsetzen kann und gebe dann feedback, sowohl dir als auch noch little_skunk
 
@ little_Skunk, funktioniert so leider immernoch nicht, weil die Spalte Anzahl im gleichen Query generiert wird und er sie so nicht (er)kennt. Trotzdem vielen Dank!
@ Listener das ist ein wirklich interessanter Ansatz, man lernt nie aus. Muss mich damit jetzt erstmal ein bisschen beschäftigen, aber es scheint tatsächlich zu funktionieren. Richtig gute Sache! :d
 
Laut deiner Aussage hat die Tabelle doch eine Spalte Anzahl. Kannst da natürlich auch jede andere Spalte eintragen.
 
In usages kannst du noch eine Spalte fürs Zugriffsdatum einfügen (e.g. uDate).
CREATE TABLE usages (
id sertial,
station integer REFERENCES stations(id),
uDate timestamp,
PRIMARY KEY (id)
);

INSERT INTO usages (station, uDate) VALUES (1,now);

Dann kannst du auch nachvollziehen, welche Station zuletzt benutzt wurde. Habs allerdings jetzt nicht nochmal getestet.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh