1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

abfrage mit count und group

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von lan4lano, 1 September 2010.

  1. lan4lano

    lan4lano Benutzer

    Hallo liebes Forum,da hier ja richtige spezialisten zu sein schein, dürfte das ein leichtes sein.
    Ich hab eine tabelle mit user, programm:
    user1, rtl
    user2, rtl
    user1, vox
    user1, vox
    ergebniss soll sein:
    2 user , rtl
    1 user, vox
    Ich hab mich schon bis auf:
    $query = "SELECT programm, count(DISTINCT user) FROM daten GROUP BY programm, user";
    rangekämpft, es kommt aber:
    1 user , rtl
    1 user, rtl
    1 user , vox
    jemand ne idee dazu?
    vielen dank -sven-
     
  2. thomas_w

    thomas_w Datenbank-Guru

    AW: abfrage mit count und group

    Dein SQL war ja schon fast richtig.

    Folgendes Beispiel dazu:

    Code:
    CREATE TABLE test_programme (
     user VARCHAR(10) NOT NULL,
     programm  VARCHAR(10) NOT NULL
    );
     
    INSERT INTO test_programme VALUES
    ( 'user1', 'rtl'),
    ( 'user2', 'rtl'),
    ( 'user1', 'vox'),
    ( 'user1', 'vox');
     
    SELECT programm, COUNT(DISTINCT user) AS anzahl_user
      FROM test_programme
     GROUP BY programm
     ORDER BY programm;
    +----------+-------------+
    | programm | anzahl_user |
    +----------+-------------+
    | rtl      |           2 |
    | vox      |           1 |
    +----------+-------------+
    2 rows in set (0.00 sec)
    mysql>
    

    Ich habe mal MySQL verwendet, obwohl dies hier die MS-SQL-Server Gruppe ist.

    Grüße
    Thomas
     
  3. Charly

    Charly Datenbank-Guru

    AW: abfrage mit count und group

    Hallo,

    und wenn mann dann in der Spalte user "2 user" stehen haben möchte kann man das Statement noch um folgendes erweitern.

    RTRIM(CAST((COUNT (DISTINCT Benutzer)) AS NCHAR)) + ' user' AS [user]

    Gruß Charly
     
  4. Charly

    Charly Datenbank-Guru

    AW: abfrage mit count und group

    Hallo,

    soll natürlich so aussehen:

    RTRIM(CAST(COUNT (DISTINCT [user]) AS NCHAR)) + ' user' AS [user]

    Gruß Charly
     
  5. lan4lano

    lan4lano Benutzer

    AW: abfrage mit count und group

    Funktioniert, Dankeschön.
    und wenn mann dann in der Spalte user "2 user" stehen haben möchte
    jetzt nicht übertreiben :)
    trotzdem danke, vllt. kann ichs nochmal irgendwann brauchen
    -Sven-
     
  6. lan4lano

    lan4lano Benutzer

    AW: abfrage mit count und group

    Moin,
    hätt da nochmal eine frage. auch wenn ich ausversehn die falsche kategorie erwischt habe, kann ja ein admin ggf. verschieben ;)

    Wie in der ersten frage hab ich immer noch eine tabelle mit user und programm.

    user; programm
    user1 rtl
    user2 rtl
    user1 vox
    user1 vox

    nun kann es 1...n user geben und ca 200 Programme.
    ich möchte nun die 5 meist gesehenen Sender raus suchen und anzeigen.
    Dazu könnt ich die abfrage aus der ersten frage ja um "Limit 1,5" erweitern.
    jetzt kommts, die restlichen sender die nicht unter den meisgeschauten 5 sind möchte ich als sonstige zusammen fassen. ergebniss sollte dann ca. so sein.
    10 rtl
    8 vox
    6 pro7
    4 sat1
    4 kabel1
    17 sonstige

    geht sowas überhaupt? wenn ja wäre ein anschauliches beispiel recht herzlich wilkommen.

    vielen dank -sven-
     
  7. Charly

    Charly Datenbank-Guru

    AW: abfrage mit count und group

    Hallo,

    als allererstes fällt mir da ein UNION ein.

    einmal nur die ersten 5 und
    einmal die ersten 5 rausgefiltert.

    Ich kann mich dunkel erinnern das es auch eleganter zu lösen geht.

    Wenns mir wieder einfällt schreibe ich nochmal.

    Gruß Charly

    PS: Habe gerade nicht so viel Zeit. Wenn ich ein bisschen Luft habe kommt das SQL auch noch.
     
  8. Charly

    Charly Datenbank-Guru

    AW: abfrage mit count und group

    Hallo,

    nicht schön aber selten.

    Das Programm 'Sonstige' habe ich einfach mal erfunden. Dann habe ich im ersten Teil die TOP 1 (nur für diese Beispiel) von der Gesamtanzahl der user abgezogen.
    Dann mit der ursprünglichen Liste die auf die TOP 1 (auch nur für diese Beispiel) reduziert ist, mit UNION zusammengeführt.

    Ein SQL-Guru bekommt das bestimmt eleganter gelöst. :)

    Code:
    SELECT 'Sonstige' AS programm,
    (
    SELECT SUM(anzahl_user) FROM
     (
     SELECT programm, COUNT(DISTINCT [user]) AS anzahl_user 
     FROM test_programme 
     GROUP BY programm 
     )AS h1
    )
    - 
    (
    SELECT SUM(anzahl_user) FROM
     (
     SELECT TOP 1 programm, COUNT(DISTINCT [user]) AS anzahl_user 
     FROM test_programme 
     GROUP BY programm 
     ORDER BY anzahl_user DESC
     ) AS h2
    )AS anzahl_user
     
    UNION
     
    SELECT programm, anzahl_user FROM 
    (
     SELECT TOP 1 programm, COUNT(DISTINCT [user]) AS anzahl_user 
     FROM test_programme 
     GROUP BY programm 
     ORDER BY anzahl_user DESC
    )AS h3
    Ich habe das nur mit den 4 Testdatensätzen getestet.

    Ergebins:

    Code:
    programm     anzahl_user
    rtl           2
    Sonstige      1
    
    Bitte mal mit den richtigen Daten testen.

    Gruß Charly
     
  9. lan4lano

    lan4lano Benutzer

    AW: abfrage mit count und group

    Moin,
    erstmal danke.
    2. ach du scheiße. Jetzt wirds ja richtig haarig

    abgesehn davon das ich durch die abfrage überhaupt nicht mehr durchblicke, bekomm ichs auch nicht angepasst für die orginal daten.
    Ich poste mal meine Tabelle:

    -Sven-
     
  10. Charly

    Charly Datenbank-Guru

    AW: abfrage mit count und group

    Hallo,

    erstmal sorry, das war MS-SQL. MySQL benutzt LIMIT statt TOP.
    Das sieht dann mit der Daten-Tabelle so aus:

    Code:
    SELECT 'Sonstige' AS programm,
    (
    SELECT SUM(anzahl_user) FROM
     (
     SELECT programm, COUNT(DISTINCT user) AS anzahl_user 
     FROM daten 
     GROUP BY programm 
     )AS h1
    )
    - 
    (
    SELECT SUM(anzahl_user) FROM
     (
     SELECT programm, COUNT(DISTINCT user) AS anzahl_user 
     FROM daten  
     GROUP BY programm 
     ORDER BY anzahl_user DESC 
     LIMIT 1,5
     ) AS h2
    )AS anzahl_user
     
    UNION
     
    SELECT programm, anzahl_user FROM 
    (
     SELECT programm, COUNT(DISTINCT user) AS anzahl_user 
     FROM daten 
     GROUP BY programm 
     ORDER BY anzahl_user DESC 
     LIMIT 1,5
    )AS h3
    ORDER BY programm 
    Und hat als Ergebnis

    Code:
    programm       user
    2714f001d171   1
    2717f001d161   2
    2718f001d175   1
    2718f001d176   1
    43100016e44    2
    Sonstige       3
     
     
    
    So das war die Pflicht. Jetzt kann man sich gedanken über die Optimierung machen. So ein Haufen verschachtelter SELECTs kostet ne Menge Performance.

    Gruß Charly
     
  11. lan4lano

    lan4lano Benutzer

    AW: abfrage mit count und group

    Nanü...
    Brauchst dich doch nicht zu entschuldigen, ich bin doch der der hier doof fragen stellt. Davon ab, es scheint ja beides sehr ähnlich zu sein, da kann sowas ja nunmal schnell passieren.

    zurück zum problem.
    erstmal vielen dank, es funktioniert.
    zweitens haste glück das du nicht hier bist, ich würd dich erstmal dicke knutschen :)
    drittens, ich hab es mal mit 500.000 datensätzen probiert, das ganze in php, also das das lange dauert kann ich nicht sagen, funktioniert gefühlt genauso schnell wie für 500.

    Nochmals ganz ganz recht herzlichen dank dafür.

    Falls ich nochmal eine frage habe meld ich mich bestimmt, wenn keine Frage mehr kommt meld ich mich wenn alles fertig ist und präsentiere mal das ergebniss, zu dem du ja nun auch einen großteil beigetragen hast.

    Dankeschön erstmal bis hier hin -Sven-
     
  12. thomas_w

    thomas_w Datenbank-Guru

    AW: abfrage mit count und group

    Hallo Charly,

    eine Super-SQL-Lösung finde ich. Da wäre ich erst einmal nicht drauf gekommen.

    Danke, mal wieder was gelernt.

    Grüße
    Thomas
     
Die Seite wird geladen...

Diese Seite empfehlen