Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Prozentualer Anteil berechnen

  1. #1
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Frage Prozentualer Anteil berechnen

    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:
    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);
    Der Anfang:
    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
    Wie Rechne ich jetzt aber (4*100)/10 und (6*100)/10?
    Kann ich in "unteren" Operationen Ergebnisse von "oben" verwenden?

    Gruß
    Karl

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    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:
    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);
    Der Anfang:
    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
    Wie Rechne ich jetzt aber (4*100)/10 und (6*100)/10?
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    Rieche mal drin, riecht es frisch, dann ist es 8.4 und auch mit drin. Riecht es schon gammelig, dann ist es kein 8.4.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    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.

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    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.
    ACK.

    Damit geht es halt nicht - so gut. Du könntest eine SRF schreiben, die das macht. Oder einfach 8.4.3 oder besser nehmen.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    Okay, nach dem Update (vom Server und DB) geht die Funktion over.

    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
    Die Summe von count(*)... stimmt aber nicht.


    Was ist SRF?

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    Okay, nach dem Update (vom Server und DB) geht die Funktion over.

    Die Summe von count(*)... stimmt aber nicht.
    Was soll den rauskommen, die Anzahl von Anschlussarten je Adresse?

    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)
    sieht für mich korrekt aus. (Digital und Digtal, Type von Dir)

    Was ist SRF?
    Set Returning Function. Brauchst aber nicht, hast ja 8.4 nun.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    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

  10. #10
    Reallo ist offline Neuer Benutzer
    Registriert seit
    18.03.2010
    Beiträge
    13

    Standard

    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum