Ich habe Städte mit Telefonanschlüssen.
Es gibt 3 verschiedenen Anschlusstypen.
Jetzt möchte ich gerne die prozentuale Verteilung je Stadt herausbekommen.
Mathematisch ist es einfach: z.B. x = (A*100)/B
A ist die Menge der Anschlussart, B die Gesamtmenge.
Das Problem ist jetzt nur, dass A eine Variable sein muss.
Hier meine Daten:
Der Anfang:Code:CREATE TABLE adresse ( id_adresse integer NOT NULL, adresse character varying(20), anschlussart character varying(10) ); INSERT INTO adresse VALUES (1, 'München', 'Analog'); INSERT INTO adresse VALUES (2, 'München', 'Analog'); INSERT INTO adresse VALUES (3, 'München', 'Digital'); INSERT INTO adresse VALUES (4, 'München', 'Sat'); INSERT INTO adresse VALUES (5, 'München', 'Analog'); INSERT INTO adresse VALUES (8, 'München', 'Analog'); INSERT INTO adresse VALUES (9, 'Berlin', 'Digital'); INSERT INTO adresse VALUES (10, 'Berlin', 'Digital'); INSERT INTO adresse VALUES (11, 'Berlin', 'Digtal'); INSERT INTO adresse VALUES (12, 'Berlin', 'Sat'); ALTER TABLE ONLY adresse ADD CONSTRAINT adresse_pkey PRIMARY KEY (id_adresse);
Wie Rechne ich jetzt aber (4*100)/10 und (6*100)/10?Code:SELECT adresse.adresse, count(adresse.anschlussart) AS Anschlusszahl, 100 AS Gesamtprozent, (SELECT count(adresse.id_adresse)FROM adresse) AS Gesamtanschlusszahl FROM adresse GROUP BY adresse.adresse
Kann ich in "unteren" Operationen Ergebnisse von "oben" verwenden?
Gruß
Karl
Hilft Dir dies hier weiter?
Code:test=*# select *, count(1) over (partition by adresse) as anz_adressen , count(*) over (partition by anschlussart) as anz_anschlussarten from adresse ; id_adresse | adresse | anschlussart | anz_adressen | anz_anschlussarten ------------+---------+--------------+--------------+-------------------- 5 | München | Analog | 6 | 4 1 | München | Analog | 6 | 4 2 | München | Analog | 6 | 4 8 | München | Analog | 6 | 4 9 | Berlin | Digital | 4 | 3 10 | Berlin | Digital | 4 | 3 3 | München | Digital | 6 | 3 11 | Berlin | Digtal | 4 | 1 4 | München | Sat | 6 | 2 12 | Berlin | Sat | 4 | 2 (10 Zeilen)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Over?
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Window Functions
Warum kennt mein postgres das nicht?
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
PostgreSQL 8.3.8 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Mist.
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Okay, nach dem Update (vom Server und DB) geht die Funktion over.
Die Summe von count(*)... stimmt aber nicht.Code:SELECT adresse.adresse, adresse.anschlussart, count(adresse.anschlussart) AS anzahl, --count(1) over (partition by adresse) as anz_adressen , count(*) over (partition by anschlussart) as anz_anschlussarten FROM adresse GROUP BY adresse.adresse, adresse.anschlussart ORDER BY adresse.adresse, adresse.anschlussart
Was ist SRF?
Was soll den rauskommen, die Anzahl von Anschlussarten je Adresse?
sieht für mich korrekt aus. (Digital und Digtal, Type von Dir)Code:test=*# SELECT adresse.adresse, adresse.anschlussart, count(*) over() AS anzahl, count(*) over (partition by anschlussart, adresse) as anz_anschlussarten FROM adresse ORDER BY adresse.adresse, adresse.anschlussart ; adresse | anschlussart | anzahl | anz_anschlussarten ---------+--------------+--------+-------------------- Berlin | Digital | 10 | 2 Berlin | Digital | 10 | 2 Berlin | Digtal | 10 | 1 Berlin | Sat | 10 | 1 München | Analog | 10 | 4 München | Analog | 10 | 4 München | Analog | 10 | 4 München | Analog | 10 | 4 München | Digital | 10 | 1 München | Sat | 10 | 1 (10 Zeilen)
Set Returning Function. Brauchst aber nicht, hast ja 8.4 nun.Was ist SRF?
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
beim group by mit adresse, anschlussart stimmt dann die anz_anschlussarten nicht mehr.
Warum steht bei anz_anschlussarten nur 1, wenn ich nach der adresse und der anschlussart gruppiere?
Code:adresse anschlussart anz_anschlussarten ---------------------------------------------------- Berlin Digital 1 Berlin Sat 1 München Analog 1 München Digital 1 München Sat 1
unschoen, aber:
SELECT ad.adresse, (SELECT COUNT(*) FROM adresse WHERE adresse=ad.adresse) AS gesamt, COUNT(anschlussart) AS anz, 100/(SELECT COUNT(*) FROM adresse WHERE adresse=ad.adresse)::real*COUNT(ad.anschlussart):: real AS prozent, anschlussart FROM
adresse ad
GROUP BY ad.adresse, ad.anschlussart
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen