Benny: SQL Abfrage

Hi,

ist folgende SQL Select Abfrage möglich:

Suche alle Kunden aus einer Tabelle, die bestimmte Stati zugewiesen bekommen haben, z. B. "Freigegeben", "Produktion", etc. und gleichzeitig den dazugehörigen Vertragsbeginn heraus (beziffert, hochgezählt).

Also bspw. sollte das Ergebnis in etwa so aussehen:

Screenshot

Die Stati "Freigegeben", etc. haben logischerweise alle eine bestimmte ID, danach könnte gecrept werden.

Mir ist nur nicht klar, wie man das als Gesamtkonstrukt baut, ich bin so weit:

  
SELECT COUNT(contract_date) AS Vertragsbeginn, COUNT(status)  
FROM my_table  
WHERE project_id = 2 AND status = 10 AND status = 5  

Hier gibt er mir schon mal alle richtigen Kunden in dem speziellen Projekt aus auch hochgezählt durch COUNT, aber ich bekomme nicht (wie auf dem Screenshot) die speziellen Stati die ich benötige.

Die Schwierigkeit ist auch noch, das mit dem Vertragsbeginn zu unterteilen..

Hoffe ihr könnt mir helfen :)

LG

  1. Hi!

    Suche alle Kunden aus einer Tabelle, die bestimmte Stati zugewiesen bekommen haben, z. B. "Freigegeben", "Produktion", etc. und gleichzeitig den dazugehörigen Vertragsbeginn heraus (beziffert, hochgezählt).

    Ja, aber ...

    Also bspw. sollte das Ergebnis in etwa so aussehen:
    Screenshot

    Dieses Bild passt nicht zur Aufgabenstellung. Denn die lautete dazu: Gib mir alle unterschiedlichen Vertragsbeginn-Daten und die Anzahl der jeweiligen Status[*] dazu.

    Die Stati "Freigegeben", etc. haben logischerweise alle eine bestimmte ID, danach könnte gecrept werden.

    Meinst du "to grab"? Denn "to crep" kennt LEO nicht. Wie wäre es mit "filtern"?

    Mir ist nur nicht klar, wie man das als Gesamtkonstrukt baut, ich bin so weit:

    Gruppiere über das Vertragsdatum und wende mehrfach COUNT(IF(status = ?, 1, NULL)) an. Statt des ? nimmst du jeweils einen der Status-Werte.

    [*] Mehrzahl von Status ist Status (mit etwas langgezogenem u gesprochen), nicht Stati.

    Lo!

    1. Hallo,

      [*] Mehrzahl von Status ist Status (mit etwas langgezogenem u gesprochen), nicht Stati.

      Ooh, hat da einer Latein (gehabt)?
      Dem habe ich nur Hinzuzufügen: Das Stimmt, denn das Wort ist im Lateinischen U-dekliniert...

      Grüße.

      1. Hi!

        [*] Mehrzahl von Status ist Status (mit etwas langgezogenem u gesprochen), nicht Stati.
        Ooh, hat da einer Latein (gehabt)?

        Nein, aber das weiß man doch. (Und wenn nicht, muss man hier nur oft genug mitlesen, dann bekommt man auch solches "weiches Wissen" vermittelt).

        Lo!

    2. Meinst du "to grab"? Denn "to crep" kennt LEO nicht. Wie wäre es mit "filtern"?

      sorry, ich meine grep (herausfiltern), komme aus der linuxwelt!

      Gruppiere über das Vertragsdatum und wende mehrfach COUNT(IF(status = ?, 1, NULL)) an. Statt des ? nimmst du jeweils einen der Status-Werte.

      Also zB

      COUNT(If(status=10, 1, NULL)), bedeudet was genau jetzt? für was stehen die parameter 1 und NULL ?

      1. Hi!

        COUNT(If(status=10, 1, NULL)), bedeudet was genau jetzt? für was stehen die parameter 1 und NULL ?

        COUNT(expr) zählt, wenn expr einen von NULL verschiedenen Wert hat. IF() liefert nun für alle passenden Status eine 1 (man kann auch was anderes ungleich NULL nehmen) und ansonsten eben NULL, damit nicht gezählt wird. Alternativ kann man unter MySQL auch NULLIF(status, 10) nehmen, damit wird die Intention vielleicht sogar noch besser deutlich.

        Lo!

        1. COUNT(expr) zählt, wenn expr einen von NULL verschiedenen Wert hat. IF() liefert nun für alle passenden Status eine 1 (man kann auch was anderes ungleich NULL nehmen) und ansonsten eben NULL, damit nicht gezählt wird. Alternativ kann man unter MySQL auch NULLIF(status, 10) nehmen, damit wird die Intention vielleicht sogar noch besser deutlich.

          Lo!

          OK!

          Also krieg ich das genauso wie auf dem Screenshot hin?

          1. Hi!

            Also krieg ich das genauso wie auf dem Screenshot hin?

            Hast du es probiert? Ich denke schon, deswegen antwortete ich das ja so.

            Lo!

            1. Hi!

              Also krieg ich das genauso wie auf dem Screenshot hin?

              Hast du es probiert? Ich denke schon, deswegen antwortete ich das ja so.

              Lo!

              Hab noch andere Dinge zu tun, aber in den nächsten Tagen werde ich mich damit mal beschäftigen, danke erstmal!

              Meld mich dann noch mal..

            2. Hi!

              Also krieg ich das genauso wie auf dem Screenshot hin?

              Hast du es probiert? Ich denke schon, deswegen antwortete ich das ja so.

              Lo!

              Also ich habe doch noch getestet:

                
              SELECT contract_date AS Vertragsbeginn,  
              COUNT(IF(status=1, "Warte auf Daten", IF(status=2, "Produziert", NULL))) AS Vertragsstatus  
              FROM my_table  
              
              

              Problem:

              1.) Er zählt auch den Vertragsbeginn irgendwie, da steht ne 0. Er soll aber nur den Status (und später andere Spalten) zählen, aber nicht alles!

              2.) Wenn ich kein COUNT mache, ist das Datum falsch formatiert, in 10-stelligen Nummern (wie genau weiß ich nicht). Das müsste auch noch richtig angezeigt werden.

              LG und danke für eure Mühen!

              1. Hi!

                Bitte zitiere nur das, worauf du dich konkret beziehst, nicht einfach alles.

                SELECT contract_date AS Vertragsbeginn,

                COUNT(IF(status=1, "Warte auf Daten", IF(status=2, "Produziert", NULL))) AS Vertragsstatus
                FROM my_table

                  
                Ich sagte mehrere COUNT(IF...)-Konstrukte, nicht mehrere IF-Konstrukte in einem COUNT. Und ich sprach davon, nach dem Vertragsbeginn zu gruppieren. Jedenfalls suggerierte mir dein Bild, dass du das pro unterschiedlichem Vertragsbeginn zusammengefasst haben möchtest.  
                  
                
                > 1.) Er zählt auch den Vertragsbeginn irgendwie, da steht ne 0. Er soll aber nur den Status (und später andere Spalten) zählen, aber nicht alles!  
                  
                Ich sehe "da" nicht, kann also auch nicht nachvollziehen, was "da" ist und warum "da ne 0 steht". Bitte beschreibe für Außenstehende nachvollziehbar. Dass alles gezählt wird, liegt sicherlich an der fehlenden Gruppierung.  
                  
                Wenn du nur bestimmte Status zählen lassen willst, musst du mit einem WHERE die Datenmenge genau darauf begrenzen. Die Zählerei ist unabhängig davon und kommt extra hinzu. Es wäre auch möglich, einfach COUNT(\*) zu zählen, aber dann müsstest du über Vertragsbeginn und Status gruppieren. Dann bekommst du jedoch nicht nur eine Zeile pro Vertragsbeginn sondern eine für jede mögliche Kombination Beginn + Status. Um daraus deine Tabelle wie im Bild zu erstellen, benötigst du zusammenfassende Logik im abfragenden Programm.  
                  
                
                > 2.) Wenn ich kein COUNT mache, ist das Datum falsch formatiert, in 10-stelligen Nummern (wie genau weiß ich nicht). Das müsste auch noch richtig angezeigt werden.  
                  
                Beispiel bitte. Welches konkrete Statement zusammen mit welchen Spaltentypen führt zu welcher Ausgabe? Dass Datumswerte in eine Darstellung ohne Trennzeichen "umformatiert" werden, passiert eigentlich nur, wenn man mit ihnen zu rechnen versucht. Oder wenn man Unix-Timestamps als Integer/String abspeichert.  
                  
                  
                Lo!
                
                1. Beispiel bitte. Welches konkrete Statement zusammen mit welchen Spaltentypen führt zu welcher Ausgabe?

                  Siehe Bild:

                  http://img691.imageshack.us/i/15237212.png/

                  Hier ist mein IQL Statement und die Ausgabe zu sehen, soweit wie ich es jetzt konkret habe.

                  Sorry, bin sql-mäßig nicht so sehr fit. Hoffe ihr habt bald Ruhe von mir und ich meine Lösung :)

                  1. Hi!

                    Beispiel bitte. Welches konkrete Statement zusammen mit welchen Spaltentypen führt zu welcher Ausgabe?
                    http://img691.imageshack.us/i/15237212.png/

                    Welchen Spaltentyp hat contract_date? Und wie übergibst du die Datümer™, in der MySQL-Datums-Formatierung YYYY-MM-DD oder als Unix-Timestamp oder anders? Beziehungsweise in welchem Format zeigt sie der phpMyAdmin bei einem einfachen "Anzeigen" an?

                    Hier ist mein IQL Statement und die Ausgabe zu sehen, soweit wie ich es jetzt konkret habe.

                    Nein, du hast keinen meiner Hinweise eingearbeitet. Es fehlt das GROUP BY, eventuell ein WHERE, wenn du nicht alls Status haben möchtest, und das COUNT zählt immer noch alles anstatt je ein COUNT (mit IF drin) für jeden Status.

                    Sorry, bin sql-mäßig nicht so sehr fit. Hoffe ihr habt bald Ruhe von mir und ich meine Lösung :)

                    Das macht gar nichts. Du musst nur mitarbeiten, wenn du dein Problem gelöst bekommen möchtest. Dazu gehört auch, sich nicht zu genieren, bei Verständnisproblemen und dergleichen nachzufragen.

                    Lo!

                    1. Welchen Spaltentyp hat contract_date? Und wie übergibst du die Datümer™,

                      contract_date hat als Datentyp varchar(11), als Kollation ist nichts spezielles eingetragen. Die gesamte Tabelle hat als Kollation jedoch latin1_swedish_ci (nehmt es einfach mal so hin.).

                      Die Daten (Plural von Datum, ich hoffe ich liege damit richtig) haben als Datentyp INT(11), die wie gesagt mit 10 Ziffern abgespeichert werden.

                      Alle Daten (nicht der Plural von Datum gemeint) in der Datenbank werden von einem in php-geschriebenen Programm genutzt. Hier werden eben über eine Benutzeroberfläche bspw. die Kundendaten gepflegt.

                      Ziel ist es eben nun, so eine Abfrage hinzubekommen, darum überhaupt mein Thread. Wenn die Abfrage funktioniert, tüte ich das in php ein und das wars. Das noch mal als Hintergrundwissen.

                      So und hier nun ein Auszug aus dem Quellcode, der für das Speichern der Daten (Plural Datum) verantwortlich ist:

                        
                       if (!$user->isAnon()) {  
                                  $st = date('Z')/3600; // server GMT timezone  
                                  $value += ($user->infos['time_zone'] - $st) * 60 * 60;  
                              }  
                        
                              $date = date('Y-m-d', intval($value));  
                        
                           /* It must "look" as a date..  
                            * XXX : do not blindly copy this code to validate other dates  
                            * this is mostly a tongue-in-cheek validation  
                            * 1. it will fail on 32 bit systems on dates < 1970  
                            * 2. it will produce different results bewteen 32 and 64 bit systems for years < 1970  
                            * 3. it will not work when year > 2038 on 32 bit systems (see http://en.wikipedia.org/wiki/Year_2038_problem)  
                            *  
                            * Fortunately tasks are never opened to be dated on 1970 and maybe our sons or the future flyspray  
                            * coders may be willing to fix the 2038 issue ( in the strange case 32 bit systems are still used by that year) :-)  
                            */  
                      
                      

                      Und hier jetzt mein aktueller Fortschritt:

                      http://img192.imageshack.us/i/79586736.png/

                      Zur Erklärung:

                      Bei SELECT habe ich wieder ein IF drin, sodass ich anstatt der ID´s eben den jeweiligen Status ausgegeben bekomme (zum Test einfach mal eine verschachtelte, so wie ich das sehe muss ich hier am Ende mehrere verschachtteln).
                      Bei WHERE habe ich "is_closed = 0" drin, d. h. zeige nur Kundentasks bzw. Tickets, die nicht geschlossen sind (nur die aktuellen).

                      LG Benny

                      1. Bei SELECT habe ich wieder ein IF drin, sodass ich anstatt der ID´s eben den jeweiligen Status ausgegeben bekomme (zum Test einfach mal eine verschachtelte, so wie ich das sehe muss ich hier am Ende mehrere verschachtteln).

                        Das nehme ich zurück, ich will ja pro Status die Anzahl der Vertragsbeginne haben.

                      2. Hi!

                        Welchen Spaltentyp hat contract_date? Und wie übergibst du die Datümer™,
                        contract_date hat als Datentyp varchar(11),

                        Das ist aus Sicht des DBMS ungünstig, da dir damit alle Möglichkeiten der Datums- und Zeitfunktionen genommen sind. Dazu müsstest du immer erst einmal vom Integerwert des Unix-Timestamps umrechnen. Aber sei es drum, du wirst es nicht ändern wollen, weil sonst ein Rattenschwanz an Änderungen in der Applikation erforderlich wäre. (Mindestens müssten bei Abfragen die Funktionen UNIX_TIMESTAMP() und FROM_UNIXTIME() hinzugefügt werden.)

                        Und hier jetzt mein aktueller Fortschritt:
                        http://img192.imageshack.us/i/79586736.png/

                        SELECT
                          FROM_UNIXTIME(contract_date) Vertragsbeginn,
                          COUNT(NULLIF(item_status, 1)) Warte,
                          COUNT(NULLIF(item_status, 2)) Produziert
                        FROM ... der Rest wie im Bild

                        (Statt NULLIF(item_status, 1) geht auch IF(item_status = 1, 1, NULL).)

                        Lo!

                        1. moin,

                          SELECT
                            FROM_UNIXTIME(contract_date) Vertragsbeginn,
                            COUNT(NULLIF(item_status, 1)) Warte,
                            COUNT(NULLIF(item_status, 2)) Produziert
                          FROM ... der Rest wie im Bild

                          (Statt NULLIF(item_status, 1) geht auch IF(item_status = 1, 1, NULL).)

                          ich mag mich täuschen, aber gibt NULLIF bei gleicheit der beiden parameter nicht NULL zurück ?

                          Ilja

                          1. Hi!

                            (Statt NULLIF(item_status, 1) geht auch IF(item_status = 1, 1, NULL).)
                            ich mag mich täuschen, aber gibt NULLIF bei gleicheit der beiden parameter nicht NULL zurück ?

                            Du täuschst dich nicht. Fehler von mir, auch schon bei der ersten Erwähnung. Also doch kein NULLIF() sondern das IF()-Konstrukt verwenden. Danke für's Aufpassen.

                            Lo!

                            1. Also doch kein NULLIF() sondern das IF()-Konstrukt verwenden.

                              Heute habe ich wieder etwas Luft, um mich damit zu beschäftigen.

                              Also noch mal zusammengefasst hier mein Statement:

                                
                              SELECT  
                                FROM_UNIXTIME(contract_date) Vertragsbeginn,  
                                IF(item_status = 1, "Warte auf Daten", NULL) Status  
                              FROM flyspray_tasks  
                              WHERE is_closed = 0  
                              GROUP BY contract_date  
                              
                              

                              Die Ausgabe sieht folgendermaßen aus:

                                
                              Vertragsbeginn 	     Status  
                              1970-01-01 01:00:00 	NULL  
                              2009-11-01 00:00:00 	NULL  
                              2009-12-01 00:00:00 	NULL  
                              2009-12-15 00:00:00 	NULL  
                              2009-12-20 00:00:00 	NULL  
                              2010-01-01 00:00:00 	NULL  
                              2010-01-02 00:00:00 	NULL  
                              2010-01-03 00:00:00 	NULL  
                              2010-01-04 00:00:00 	NULL  
                              2010-02-01 00:00:00 	NULL  
                              2010-02-15 00:00:00 	NULL  
                              2010-02-20 00:00:00 	NULL  
                              2010-03-01 00:00:00 	NULL  
                              2010-03-15 00:00:00 	NULL  
                              2010-04-01 00:00:00 	NULL  
                              2010-05-01 00:00:00 	NULL  
                              2010-06-01 00:00:00 	NULL  
                              2010-07-01 00:00:00 	NULL  
                              2010-09-01 00:00:00 	NULL  
                              2010-12-01 00:00:00 	NULL  
                              
                              

                              Also was auf jeden Fall passt, ist die Ausgabe des Vertragsbeginns (wobei hier ein nice to have wäre, wenn die Uhrzeit wegfällt!).

                              Laut dedlfix soll eben das IF-Konstrukt benutzt werden, jedoch sieht man an der Ausgabe, dass hier etwas falsch läuft. Muss ich nicht hier ein

                                
                              ...  
                              COUNT(IF(item_status=1, "Warte auf Daten", IF(....)))  
                              ...  
                              
                              

                              Konstrukt verwenden, d. h. alle Status in verschachtelte IF Bedingungen, die unter einem COUNT laufen?

                              1. Laut dedlfix soll eben das IF-Konstrukt benutzt werden, jedoch sieht man »» Muss ich nicht hier ein Konstrukt verwenden, d. h. alle Status in  verschachtelte IF Bedingungen, die unter einem COUNT laufen?

                                EDIT:

                                Habe etwas rumgespielt, bin zu 99% an meiner Lösung:

                                  
                                SELECT  
                                  FROM_UNIXTIME(contract_date) Vertragsbeginn,  
                                  IF(item_status = 2, COUNT(item_status), '0') 'Neue Aufgabe',  
                                  IF(item_status = 15, COUNT(item_status), '0') 'Fertig',  
                                  IF(item_status = 19, COUNT(item_status), '0') 'in Klärung',  
                                  IF(item_status = 74, COUNT(item_status), '0') 'Warte auf Daten',  
                                  IF(item_status = 76, COUNT(item_status), '0') 'Daten komplett',  
                                  IF(item_status = 77, COUNT(item_status), '0') 'WIP-Entwurf'  
                                FROM flyspray_tasks  
                                WHERE is_closed = 0  
                                GROUP BY contract_date  
                                
                                

                                Ausgabe siehe Bild!

                                So ungefähr wollte ich es haben.

                                Allerdings stimmen die Werte nicht.. Klar, 01.01.1970 das werden die ohne konkreten Vertragsbeginn sein, da hier kein Datum ausgewählt wurde und unser Programm hier selbst eins gewählt hat.

                                Aber die anderen Werte stimmen leider nicht. Stimmt denn das Statement so?

                                Wenn ihr sagt, das Statement ist korrekt, muss ich wohl noch mal alle status-id´s checken..

                                oder habt ihr noch nen anderen ansatz? LG

                                1. moin,

                                  Wenn ihr sagt, das Statement ist korrekt, muss ich wohl noch mal alle status-id´s checken..

                                  ich hatte dich schon mal auf das problem hingewiesen, dass es mit normalem sql nicht so einfach zu lösen ist. der knackpunkt ist der, dass diese abfrage nicht "richtig" funktioniert, wenn neue statuswerte hinzukommen.

                                  Ilja

                                  1. ich hatte dich schon mal auf das problem hingewiesen, dass es mit normalem sql nicht so einfach zu lösen ist. der knackpunkt ist der, dass diese abfrage nicht "richtig" funktioniert, wenn neue statuswerte hinzukommen.

                                    Ach mist ok, das heißt ich muss anstatt der ID´s ein "?" setzen und das php-mäßig lösen?

                                    1. moin,

                                      Ach mist ok, das heißt ich muss anstatt der ID´s ein "?" setzen und das php-mäßig lösen?

                                      du musst dir grundsätzlich vor augen halten, dass die anzahl der spalten variable sein kann, je nachdem wieviele unterschiedliche statuswerte es eben gibt. dazu gibt es eventuell lösungen, das hängt aber stark von deinem dbms ab. was mysql betrifft so war mir, das Vinzenz dies bezüglich eine gute lösung parat hat, ich kann mich aber auch irren. bietet dir das dbms keine lösung an musst du es zum beispiel mit php angehen. diese kannst du machen, indem du zusätzlich zum datum auch über den statuswert gruppierst und es dann über die programmiersprache wie gewollt darstellst.

                                      Ilja

                                2. Aber die anderen Werte stimmen leider nicht. Stimmt denn das Statement so?

                                  Habe das Statement geändert, sodass er jetzt richtig zählt:

                                    
                                  SELECT  
                                  IF(contract_date = 0,"ohne Vertragsbeginn",FROM_UNIXTIME(contract_date)) Vertragsbeginn,  
                                  COUNT(IF(item_status = 74, "Warten auf Daten", NULL)) 'Warten auf Daten',  
                                  COUNT(IF(item_status = 82, "Warten auf Kunden", NULL)) 'Warten auf Kunden',  
                                  COUNT(IF(item_status = 76, "Daten komplett", NULL)) 'Daten komplett',  
                                  COUNT(IF(item_status = 77, "WIP-Entwurf", NULL)) 'WIP-Entwurf',  
                                  [..]  
                                  FROM flyspray_tasks  
                                  WHERE is_closed = 0 AND project_id = 2  
                                  GROUP BY contract_date  
                                  
                                  

                                  Funzt soweit, super!

                                  Bin gerade drüber, "Zwischenschritte" zu summieren, d. h. in etwa so:

                                    
                                  [...]  
                                  COUNT(IF(item_status = 74, "Warten auf Daten", NULL)) 'Warten auf Daten',  
                                  COUNT(IF(item_status = 82, "Warten auf Kunden", NULL)) 'Warten auf Kunden',  
                                  COUNT('Warten auf Daten' + 'Warten auf Kunden') 'Kunde im Verzug allgemein'  
                                  
                                  

                                  Haut nur noch nicht so ganz hin. Bei 'Warte auf Daten' gibt er mir 15 Einträge, bei 'Warten auf Kunden' 6 Einträge. Nur zählt er anschließend bei 'Kunde im Verzug' auf 24 hoch.

                                  Hab das schon auch mit SUM versucht, jedoch auch ohne Erfolg!

                                  LG Benny

                                  1. Hi!

                                    Bin gerade drüber, "Zwischenschritte" zu summieren, d. h. in etwa so:

                                    [...]

                                    COUNT(IF(item_status = 74, "Warten auf Daten", NULL)) 'Warten auf Daten',
                                    COUNT(IF(item_status = 82, "Warten auf Kunden", NULL)) 'Warten auf Kunden',
                                    COUNT('Warten auf Daten' + 'Warten auf Kunden') 'Kunde im Verzug allgemein'

                                      
                                    Deine Erwartungshaltung ist eine andere als MySQLs tatsächliche Arbeitsweise. 'foo' ist ein String, kein Spaltennamen und auch kein Aliasname. Wenn du 'Warten auf Daten' + 'Warten auf Kunden' notierst, macht MySQL daraus eine Addition zweier Zahlen. 'Warten auf Daten' ist ein String, 'Warten auf Kunden' auch, beide evaluieren im nummerischen Kontext (kommt durch das +) zu 0. Der Ausdruck ergibt also 0 + 0 => 0. COUNT() prüft nur, ob das übergebenen Argument ein von NULL verschiedener Wert ist (oder \*) und zählt oder zählt nicht. Und zwar den aktuellen Datensatz. Da dein Ausdruck einen von NULL verschiedenen Wert ergibt, zählt es alle Datensätze, die die WHERE-Bedungung erfüllen. Das ist der gleiche Effekt, wie wenn du COUNT(\*) oder COUNT(0) schreibst.  
                                      
                                    Wenn du Werte mit den Status 74 oder 82 zählen willst, musst du stattdessen die IF()-Funktion entsprechend bestücken:  
                                      COUNT(IF(item\_status IN (74, 82), 1, NULL))  
                                    (Anstelle der 1 einen String anzugeben bringt keinerlei Vorteile, zumal du die Bedeutung des Status ja auch schon im Aliasnamen stehen hast.  
                                      
                                      
                                    Lo!
                                    
                              2. Hi!

                                Laut dedlfix soll eben das IF-Konstrukt benutzt werden, jedoch sieht man an der Ausgabe, dass hier etwas falsch läuft. Muss ich nicht hier ein

                                ...

                                COUNT(IF(item_status=1, "Warte auf Daten", IF(....)))
                                ...

                                
                                > Konstrukt verwenden, d. h. alle Status in verschachtelte IF Bedingungen, die unter einem COUNT laufen?  
                                  
                                Nein, nochmals: Nicht mehrere IFs in einem COUNT sondern mehrere COUNTs mit jeweils einem IF drin.  
                                  
                                  
                                Lo!
                                
                  2. moin,

                    Sorry, bin sql-mäßig nicht so sehr fit. Hoffe ihr habt bald Ruhe von mir und ich meine Lösung :)

                    nicht fit zu sein ist nicht schlimm. deine abfrage funktioniert so nur bei mysql, jedes andere dbms würde dir eine fehlermeldung ausgeben und das zurecht. ohne zuweit ins detail einzugehen, du solltest gruppieren.

                    SELECT  contract_date Vertragsbeginn, COUNT(*) Anzahl
                    FROM my_table
                    GROUP BY contract_date
                    ;

                    damit hast du schon mal eine abfrage, die auch funknioert, wenn auch noch nicht so alles darstellt, wie du es willst. was du haben willst ist mit sql nicht ganz trivial, entspricht eher einer pivot tabelle. die lösungen dies bezüglich hängen immer stark von dem jeweiligen dbms ab. wenn ich mich richtig erinnere hanz Vinzenz dafür immer brauchbare lösungen.

                    Ilja

      2. Hi!

        COUNT(If(status=10, 1, NULL)), bedeudet was genau jetzt? für was stehen die parameter 1 und NULL ?

        Steht auch alles in der Doku. Unterscheidet sich auch nicht von anderen Programmen, wie z.B. Excel.

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett