Ankündigung

Einklappen
Keine Ankündigung bisher.

Anzahl Verkaufstage

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Anzahl Verkaufstage

    Ich hatte dasselbe Problem schon mal, dachte es wäre gelöst bis ich den ONLY_FULL_GROUP_BY Modus aktiviert habe. Aber ich fang lieber sauber von vorne an:

    Code:
    DROP TABLE IF EXISTS `verkaeufe`;
    CREATE TABLE IF NOT EXISTS `verkaeufe` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `verkaufstage_id` int(11) NOT NULL,
      `artikel_id` int(11) NOT NULL,
      `menge` int(11) NOT NULL,
      `VK` float NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
    
    --
    -- Daten für Tabelle `verkaeufe`
    --
    
    INSERT INTO `verkaeufe` (`id`, `verkaufstage_id`, `artikel_id`, `menge`, `VK`) VALUES
    (1, 1, 1, 2, 1),
    (2, 1, 2, 3, 1),
    (3, 2, 1, 3, 1),
    (4, 2, 2, 4, 1),
    (5, 3, 1, 1, 1),
    (6, 3, 1, 1, 1),
    (7, 4, 1, 1, 1),
    (8, 5, 1, 1, 1),
    (9, 5, 2, 2, 1);
    COMMIT;
    
    
    DROP TABLE IF EXISTS `verkaufstage`;
    CREATE TABLE IF NOT EXISTS `verkaufstage` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `geschaeft_id` int(11) NOT NULL,
      `datum` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
    
    --
    -- Daten für Tabelle `verkaufstage`
    --
    
    INSERT INTO `verkaufstage` (`id`, `geschaeft_id`, `datum`) VALUES
    (5, 1, '2019-01-16'),
    (2, 2, '2019-01-14'),
    (4, 2, '2019-01-15'),
    (1, 1, '2019-01-14'),
    (3, 1, '2019-01-15');
    COMMIT;
    
    SELECT geschaeft_id, COUNT(geschaeft_id) as Verkaufstage, SUM(menge*VK) AS Umsatz FROM verkaeufe
    JOIN verkaufstage ON verkaeufe.verkaufstage_id = verkaufstage.id
    GROUP BY geschaeft_id
    
    Was ich als Ergebnis brauche:

    Code:
     





  • #2
    Dein Datenmodell ist rätselhaft, Deine Fremdschlüsselbeziehung inkonsistent. Was auch kein Wunder ist, da a) nicht richtig definiert und b) MyISAM ...
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zitat von akretschmer Beitrag anzeigen
      Dein Datenmodell ist rätselhaft, Deine Fremdschlüsselbeziehung inkonsistent. Was auch kein Wunder ist, da a) nicht richtig definiert und b) MyISAM ...
      Das Datenmodell ist nicht nur rätselhaft, sondern schlicht falsch. Dein "Ceterum Censeo" MyISAM hat damit erstmal gar nichts zu tun.

      phpP Fang ganz von vorne an, nämlich mit einem vernünftigen Datenmodell. Das war bereits bei deinem Group-by-Thread eines der Probleme.

      Du brauchst für dieses Tabellen (mind.) 4 Tabellen (Details später). Dein SQL zählt nicht die Verkaufstage, sondern die Geschäfte, und das sind 9, also kann das Ergebnis, das du erhälst, nicht falsch sein, sonst würden ja Geschäfte ignoriert.

      Kommentar


      • #4
        Zitat von Alf2016 Beitrag anzeigen
        Dein "Ceterum Censeo" MyISAM hat damit erstmal gar nichts zu tun.
        Das bezog sich auch nicht auf das Datenmodell, sondern auf die Inkonsistenzen. MyISAM kann nun mal keine referentielle Integrität. Unter anderem.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Fang ganz von vorne an, nämlich mit einem vernünftigen Datenmodell.
          Was braucht Ihr da von mir?

          Was ich lösen muss: es gibt verschiedene Geschäfte, die aber nur an einigen Tagen geöffnet sind. Wenn ein Geschäft geöffnet ist, gibt es einen Eintrag in Tabelle 'verkaufstage'. In 'verkäufe' werden die Umsätze pro Artikel erfasst.

          Das einzige, was mir an dieser ansonsten komplexeren Abfrage fehlt, ist, wie ich die Anzahl der Öffnungstage erfassen kann.

          Kommentar


          • #6
            Zitat von phpP Beitrag anzeigen

            Was braucht Ihr da von mir?

            Was ich lösen muss: es gibt verschiedene Geschäfte, die aber nur an einigen Tagen geöffnet sind. Wenn ein Geschäft geöffnet ist, gibt es einen Eintrag in Tabelle 'verkaufstage'. In 'verkäufe' werden die Umsätze pro Artikel erfasst.

            Das einzige, was mir an dieser ansonsten komplexeren Abfrage fehlt, ist, wie ich die Anzahl der Öffnungstage erfassen kann.
            Wir brauchen gar nicht, du brauchst. Ein vernünftiges Datenmodell. Um dir dabei zu helfen, wäre es hilfreich, wenn du mal schildern würdest, was du da eigentlich im realen Leben machst. Stichwort "Öffnungstage" ist schon ein guter Anfang. Dann solltest du, bevor wir versuchen, die bei der Entwicklung eines korrekten Datenmodells zu helfen, noch sagen, welche Daten du brauchst - ebenfalls in einer "real-Lebens-Sprache".

            Kommentar


            • #7
              Code:
              test=# create table geschaefte(id serial primary key, name text, adresse text);
              CREATE TABLE
              test=*# create table verkaufstage (id serial primary key, geschaeft_id int references geschaefte, datum date);
              CREATE TABLE
              test=*# create table artikel (id serial primary key, name text);
              CREATE TABLE
              test=*# create table verkaeufe(id serial primary key, verkaufstage_id int references verkaufstage, artikel_id int references artikel, menge int, vk int);
              CREATE TABLE
              test=*# insert into artikel values (1, 'artikel 1');
              INSERT 0 1
              test=*# insert into artikel values (2, 'artikel 2');
              INSERT 0 1
              test=*# insert into artikel values (3, 'artikel 3');
              INSERT 0 1
              test=*# insert into geschaefte values (1, 'laden 1', '');
              INSERT 0 1
              test=*# insert into geschaefte values (2, 'laden 2', '');
              INSERT 0 1
              test=*# insert into geschaefte values (3, 'laden 3', '');
              INSERT 0 1
              test=*# insert into verkaufstage values (5, 1, '2019-01-06');
              INSERT 0 1
              test=*# insert into verkaufstage values (2, 2, '2019-01-14');
              INSERT 0 1
              test=*# insert into verkaufstage values (4, 2, '2019-01-15');
              INSERT 0 1
              test=*# insert into verkaufstage values (1, 1, '2019-01-14');
              INSERT 0 1
              test=*# insert into verkaufstage values (3, 1, '2019-01-15');
              INSERT 0 1
              
              test=*# copy verkaeufe from stdin;
              Enter data to be copied followed by a newline.
              End with a backslash and a period on a line by itself, or an EOF signal.
              >> 1    1    1    2    1
              >> 2    1    2    3    1
              >> 3    2    1    3    1
              >> 4    2    2    4    1
              >> 5    3    1    1    1
              >> 6    3    1    1    1
              >> 7    4    1    1    1
              >> 8    5    1    1    1
              >> 9    5    2    2    1
              >> \.
              COPY 9
              test=*# commit;
              COMMIT
              
              test=*# select g.id, count(distinct vt.datum), sum(v.menge*v.vk) from verkaeufe v left join verkaufstage vt on v.verkaufstage_id=vt.id left join geschaefte g on vt.geschaeft_id=g.id group by g.id;
               id | count | sum
              ----+-------+-----
                1 |     3 |  10
                2 |     2 |   8
              (2 rows)
              
              test=*#
              Prost.

              Das jetzt mal so in etwa wie Dein Datenmodell, aber mit mehr Tabellen und referentieller Integrität.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8

                count(distinct vt.datum) ist es. Wunderbar und vielen Dank, jetzt kann ich entspannt schlafen. Ich werde Euch in mein Nachtgebet einschließen

                Ich hatte schon mal nach einem Link wegen Innodb gefragt, aber keiner hat reagiert. Der Wiki Eintrag ist nicht sooo ersprießlich. Kann man denn auf einem Webserverpaket - da läuft die Anwendung - auf InnoDB umstellen?

                Kommentar


                • #9
                  Zitat von phpP Beitrag anzeigen
                  count(distinct vt.datum) ist es. Wunderbar und vielen Dank, jetzt kann ich entspannt schlafen. Ich werde Euch in mein Nachtgebet einschließen
                  Kasten Bier wär mir lieber.

                  Ich hatte schon mal nach einem Link wegen Innodb gefragt, aber keiner hat reagiert. Der Wiki Eintrag ist nicht sooo ersprießlich. Kann man denn auf einem Webserverpaket - da läuft die Anwendung - auf InnoDB umstellen?
                  Vermutlich wird Dir das der Support Deines Hosters besser beantworten können als wir.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Zitat von phpP Beitrag anzeigen
                    count(distinct vt.datum) ist es. Wunderbar und vielen Dank, jetzt kann ich entspannt schlafen. Ich werde Euch in mein Nachtgebet einschließen ...
                    Beantworte mir mal folgende Frage ganz genau: Was hast du jetzt gelernt?

                    Kommentar


                    • #11
                      Du kannst dir mit
                      Code:
                      SHOW ENGINES;
                      die verfügbaren Storage Engines anzeigen lassen.

                      Sollte InnoDB vorhanden sein, reicht ein einfaches
                      Code:
                      ALTER TABLE `tabelle` ENGINE = INNODB;
                      um die Engine einer Tabelle umzustellen.

                      Grüße.

                      Kommentar


                      • #12
                        @php1704: Thanks!

                        @Alf2016
                        Das einem hier prima geholfen wird!

                        Ich programmiere schon ganze Zeit Webanwendungen, habe aber kein Informatik studiert. Das ist das erste mal, dass ich mit komplexeren Queries zu tun habe. Ich habe jetzt ONLY_FULL_GROUP_BY aktiviert, habe glaube ich in Ansätzen verstanden wie GROUP BY funktiniert und den Dreh mit DISTINCT in diesem Fall verstanden.

                        ImmoDB steht auf dem todo Zettel und das mit den Referentiellen Integrität. Und wenn ich noch mal auf so ne große Hürde stoße schreib ich's wohl besser gleich in die Jobs.

                        Kommentar


                        • #13
                          und nicht vergessen statt
                          DEFAULT CHARSET=latin1;
                          immer utf8 nehmen, das ist heute Standard.

                          Kommentar


                          • #14
                            Zitat von protestix Beitrag anzeigen
                            und nicht vergessen statt
                            DEFAULT CHARSET=latin1;
                            immer utf8 nehmen, das ist heute Standard.
                            Bei der heutigen Smartphone-Generation wohl eher utf8mb4.

                            Kommentar


                            • #15
                              Zitat von hellbringer Beitrag anzeigen

                              Bei der heutigen Smartphone-Generation wohl eher utf8mb4.
                              Und was ist der Unterschied?

                              Kommentar

                              Lädt...
                              X