Anzeige:
Ergebnis 1 bis 14 von 14

Thema: SQLite COUNT

  1. #1
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76

    SQLite COUNT

    Hallo zusammen,

    ich habe eine Frage bezüglich SQLite und COUNT. Ich habe eine Tabelle, die in etwa so aussieht:

    Code:
    MeineTabelle
    
       A           B
       a1         b1
       a2         b1
       a3         b2
       a4         b3
    Meine Abfrage sieht bisher so aus:

    Code:
    SELECT A, B, COUNT(DISTINCT B) "C" FROM MeineTabelle
    Das Ergebnis von COUNT wäre dann ja 3. Nun möchte ich beisielsweise auf sowas wie C.1 zugreifen. Ich hoffe, ihr versteht was ich meine.

    Hat da jemand eine Idee, wie man das machen könnte?

    --------UPDATE----------

    Ich habe jetzt durch die Abfrage

    Code:
    SELECT A, MIN(B), MAX(B) FROM MeineTabelle
    das Ergebnis

    Code:
    A      MIN(B)     MAX(B)
    a4       b1         b3
    erhalten. Jetzt kann ich theoretisch schon auf Das Minimum und das Maximum zugreifen. Allerdings fehlt mir b2 noch. Da habe ich nichts gefunden, wie ich darauf zugreifen kann... In der "A"-Spalte steht nun auch nur noch a4, warum kann ich mir auch nicht so ganz erklären. Kann mir jemand weiterhelfen?

    Gruß
    Isa
    Geändert von maria_dolores (02-08-2010 um 09:41 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    hallo,

    du musst wahrsch mit mehreren anfragen arbeiten.
    die verschiedenen b-werte kriegst du mit


    select distinct b from c

    dann kannst du in deinem programm über das ergebnis iterieren
    und für jedes ergebnis zu dem du die a-werte willst kannst du

    select a from c where b="$b"

    nutzen. $b ist in diesem Fall die Variable.

    Generell wenn du min,max oder count verwendest, wird automatisch eine gruppierung genutzt: http://www.google.de/search?client=o...utf-8&oe=utf-8
    aus diesem grund siehst du bei deiner letzen abfrage nur noch eine ergebnisreihe.

    was möchtest du denn eigentlich genau erreichen?

  3. #3
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Hallo,

    erstmal danke für Deine Antwort. Ich aktualisiere mal meine Tabelle. Also insgesamt sieht es in etwa so aus:

    Code:
     A           B       TIME
     a1          b1      3.01
     a2          b1      2.02
     a3          b2      2.45
     a4          b3      0.55

    Im Endeffekt möchte ich dass die Tabelle dann so aussieht:

    Code:
    A       B       TIME
    a1              3.01
    a2              2.02
            b1      5.03
    a3              2.45
            b2      2.45
    a4              0.55
            b3      0.55
    Ich kann mir denken, dass es recht schwierig und aufwendig ist.
    Ist klar, was ich meine?

    Ich arbeite mit Python und implentiere die erzeugte Tabelle dann mit reportlab in ein PDF-Dokument. Ich bin jetzt soweit, dass ich mit der Abfrage

    Code:
    SELECT A, B, COUNT(B) FROM MeineTabelle GROUP BY B
    die Tabelle

    Code:
    A        B         TIME     COUNT
    a1      b1        3.01       2
    a2      b2        2.45       1
    a3      b3        0.55       1
    erhalte. Jetzt taucht allerdings das zweite a1 nicht mehr auf, was denke ich auf das GROUP(B) zurückzuführen ist. Ich weiss nicht, ob das ein einigermaßen vernünftiger Ansatz ist.. ?

    Gruß
    Isa
    Geändert von maria_dolores (02-08-2010 um 12:06 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    du kanst die daten zB so auslesen (weiß allerdings nicht ob sqlite das kann):

    Code:
    select a,b,time from c
    union 
    select null a, b, sum(time) time from c 
    group by b
    dann kommt das ergebnis wie du es wolltest (nur anderst sortiert)
    alernativ lies doch einfach alle werte von c aus mit
    Code:
    select a,b,time from c order by b;
    und summier die werte zu jedem b in deiner anwendung zusammen.

  5. #5
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Hallo,

    ich habe eben versucht Deine erste Lösung auszutesten. In SQLite gibt es auch ein UNION, was, so wie ich es verstanden habe, genauso funktioniert. Allerdings bekomme ich bei Deinem Kommando nicht das raus, was ich gern wollte.

    Ich hab dann noch das eine oder andere versucht, den Fehler aber nicht gefunden. Ich hab einen Screenshot angehängt. Vielleicht kannst Du mal drüberschauen, was ich falsch gemacht habe.

    Gruß
    Isa
    Geändert von maria_dolores (02-08-2010 um 16:22 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    warum ist das nicht das ergebnis was du willst (außer der Sortierung)?

  7. #7
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Die Sortierung ist mir gerade gar nicht so wichtig. Allerdings sind keine Zeiten zusammengerechnet und die Anordnung der einzelnen Spalten ist auch ganz anders als ich es mir gedacht hatte.

    Vielleicht hab ich mich bei meinem "Wunsch" auch etwas unglücklich ausgedrückt.

    Code:
    Meine Tabelle
    
    A                   B                  Time
    -----------------------------------------------
    a1                                    3.01
    a2                                    2.02
    -----------------------------------------------
                       b1                 5.03
    -----------------------------------------------
    a3                                    2.45
    -----------------------------------------------
                       b2                 2.45
    -----------------------------------------------
    a4                                    0.55
    -----------------------------------------------
                       b3                 0.55
    Natürlich sollte die Tabelle, die bei der Abfrage herauskommt dieser recht ähnlich sehen, da ich nicht mehr allzu viel in Python schreiben möchte. Ich habe insgesamt so um die 100 Tabellen dieser Art von daher möchte ich eben so wenig wie möglich extra machen müssen.

    Verstehst Du mein Problem oder beschreibe ich es zu unklar (also was das "Layout" der Tabelle angeht)?

    Gruß Isa

  8. #8
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Was du suchst ist ein JOIN Syntax.
    Code:
    SELECT
      a.EINS AS Erste,
      a.ZWEI AS Zweite,
      COUNT(DISTINCT a.DREI) AS Dritte,
      COUNT(DISTINCT b.DREI) AS Vierte
    FROM
      tabelle AS a,
      tabelle AS b
    WHERE (
      a.DREI='1'
    AND
      b.DREI='2'
    );
    http://www.shokhirev.com/nikolai/abc/sql/joins.html
    Geändert von undefined (02-08-2010 um 17:28 Uhr) Grund: Komma vergessen
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von maria_dolores Beitrag anzeigen
    Die Sortierung ist mir gerade gar nicht so wichtig. Allerdings sind keine Zeiten zusammengerechnet und die Anordnung der einzelnen Spalten ist auch ganz anders als ich es mir gedacht hatte.

    Vielleicht hab ich mich bei meinem "Wunsch" auch etwas unglücklich ausgedrückt.

    Code:
    Meine Tabelle
    
    A                   B                  Time
    -----------------------------------------------
    a1                                    3.01
    a2                                    2.02
    -----------------------------------------------
                       b1                 5.03
    -----------------------------------------------
    a3                                    2.45
    -----------------------------------------------
                       b2                 2.45
    -----------------------------------------------
    a4                                    0.55
    -----------------------------------------------
                       b3                 0.55
    Natürlich sollte die Tabelle, die bei der Abfrage herauskommt dieser recht ähnlich sehen, da ich nicht mehr allzu viel in Python schreiben möchte. Ich habe insgesamt so um die 100 Tabellen dieser Art von daher möchte ich eben so wenig wie möglich extra machen müssen.

    Verstehst Du mein Problem oder beschreibe ich es zu unklar (also was das "Layout" der Tabelle angeht)?

    Gruß Isa

    genau das kriegst du doch raus, schau mal deinen screenshot nochmal genau an.

    der einzige unterschied ist, dass die zusammengerechneten werte (b-Werte) oben stehen (die ersten 3 Zeilen). danach kommen die einzelnen werte.
    Sortierung kannst du mit order by noch einfügen, musst du aber als Subselect machen.

    so funktionierts in mysql, weiß nicht ob sqlite das auch kann:
    Code:
    select * from (
    select a,b,time from c
    union 
    select null a, b, sum(time) time from c 
    group by b
    ) a
    order by b,(a is null)

  10. #10
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Hallo,

    hem hem.. da hab ich ja wirklich auf dem Schlauch gestanden... Danke.
    Ich habe da gerade noch eine Frage - kann ich die irgendwie die Summe aus Summen bilden? Also so etwas wie
    Code:
    SELECT SUM(SUM(ZweiteSpalte) - SUM(ErsteSpalte)) FROM MeineTabelle
    Bisher gibt er mir einen Error:
    Code:
    Last Error: misuse of aggregate function SUM()
    Hat jemand da eine Idee, wie man das lösen kann?


    -----------------------UPDATE---------------------------

    Wenn ich meine Tabelle vom Anfang des Threads so verändere, dass sie nicht mehr so


    Code:
     A           B       TIME
     a1          b1      3.01
     a2          b1      2.02
     a3          b2      2.45
     a4          b3      0.55
    aussieht, sondern so

    Code:
     A           B       TIME
     a1          b1      3.01
     a2          b1      2.02
     a2          b1      1.05
     a3          b2      2.45
     a4          b3      0.55
    dann schreibt er die beiden "a2" doppelt hin. Kann man das irgendwie unterdrücken, dass die Abfrage trotzdem noch genauso aussieht wie vorher?

    Gruß Isa
    Geändert von maria_dolores (03-08-2010 um 10:46 Uhr)

  11. #11
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Habe die Lösung gerade selbst gefunden =)

    Code:
    select * from (
    select a,b,time from c
    group by a
    union 
    select null a, b, sum(time) time from c 
    group by b
    ) a
    order by b,(a is null)
    Geändert von maria_dolores (03-08-2010 um 12:02 Uhr)

  12. #12
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Hat trotzdem vielleicht jemand eine Idee, wie man das Problem der "doppelten" Summe lösen könnte?

    Ich habe also sowas wie
    Code:
    select sum(sum(b) - sum(a)) from meinetabelle
    als Ergebnis erhalte ich einen Error:
    Code:
    misuse of aggregate function SUM()
    Ich habe jetzt schon viel probiert, aber bisher hat nichts geklappt. Hat jemand vielleicht einen Hinweis oder vielleicht sogar eine Lösung für mich?

    Gruß Isa

  13. #13
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Wenn du so etwas mit einer Abfrage machen willst dann geht das bei SQLite nur mit JOINS
    SQLite ist kein SQLServer der je nach bedarf einen HEAP oder auf einen Temporären Speicher ablegt um Sortier algos durch zu führen.
    Ansonsten mußt du das alles selbst machen, eben SQLite
    Des weiteren kannst du ein multi-argument max(a,b,...) verwenden http://www.sqlite.org/lang_corefunc.html oder eigene Agregat funktionen erstellen.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  14. #14
    Registrierter Benutzer Avatar von maria_dolores
    Registriert seit
    09.05.2008
    Beiträge
    76
    Hey,

    danke. Das hat mir echt geholfen.

    Gruß
    Isa

Lesezeichen

Berechtigungen

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