Standardabweichung gruppiert nach Monat und Artikel

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

  • Standardabweichung gruppiert nach Monat und Artikel

    Hallo Zusammen,

    Nach 2 Wochen Trial und Error hab ich viel gelernt und auch einiges hinbekommen. Jetzt happerts aber...

    >>>>Möchte Folgendes als Resultat - Zieltabelle<<<<
    Artikel | Standardabweichung |
    A | 90
    B | 100
    (Hier soll die Standardabweichung stehen, diese aber von Zahlen gruppiert auf Monatsebene sein)

    Zur Erklärung
    >>>>1) Ursprungstabelle<<<<
    Habe eine Tabelle Rechnungen:
    Artikel | Stk | Datum ...
    A | 300 | 10.1.2009
    A | 200 | 15.1.2009
    A | 150 | 02.2.2009
    A | 200 | 18.2.2009
    A | 200 | 10.7.2009
    B | 500 | 23.3.2009
    B | 400| 14.4.2009

    >>>>2) Guppiert auf Monatsebene<<<<
    Artikel | Stk | Datum ...
    A | 500| 1 (also Januar)
    A | 350| 2 (also Februar)
    A | 200| 7 (also July)
    B | 500 | 3 (also März)
    B | 400 | 4 (also April)
    (später Frage ich noch eine zusätzliche Tabelle mit Monaten von 1-12 ab, damit alle Monate pro Teil gezeigt werden. Aber jetzt erst mal nur mit einer Tabelle)

    >>>>3) Standardabweichung pro Artikel<<<<
    also für A: Stdev (500,350,200) B:Stdev(500,400)
    und dann eben die Tabelle wie Eingangs in Zieltabelle beschrieben.
    Artikel | Standardabweichung |
    A | 90
    B | 100
    (90 und 100 nur so hingeschrieben, nicht gerechnet)
    (Irgendwann mal dann Stdev(500,350,0,0,0,0,200,0,0,0,0,0), 12 Monate eben. Aber wie gesagt, jetzt erst mal mit einer Tabelle.


    >>>>Zu meiner Query<<<<<
    (Sorry fuer die Englischen Bezeichnungen. QTY=Stück, 10a_Invoices = Tabelle Rechnungen, Part_No_=Artikel, Invdate=Datum der Rechnung)

    >>>Stdev von einem Teil<<<<
    Select Stdev(F1) as F2
    FROM(
    select sum(QTY) as F1
    FROM 10a_Invoices where Part_No_='FD430163' and year(Invdate)=2007 group by month(Invdate))
    --> Das geht und gibt mir die Standardabweichung, aber eben nur für einen Artikel.

    >>>>Stdev aller Teile<<<<
    Jetzt möcht ich aber natürlich, dass die Standardabweichung für alle Artikel gezeigt wird:
    Meine Idee war noch ein Select vorne anschliessen auf Artikel gruppiert und die Unterabfrage über den Artikel verknüpfen. Also in diese Richtung:

    Select y.Part_No_, (
    -----
    (
    Select Stdev(F1)
    FROM(
    select sum(QTY) as F1
    FROM 10a_Invoices where Part_No_=y.Part_No_ and year(Invdate)=2007 group by month(Invdate))
    ) as F2
    ----
    From 10a_Invoices y group by Part_No_

    (Kann sein dass ein paar Schönheitsfehler drin sind um die gehts mir aber grad nicht)
    --> War glaub ich ne schöne Idee, geht aber in leider in dem Fall nicht. Die Unterabfrage wird eben nicht für alle y.Part_No_ der Reihe nach durchlaufen sondern fragt dann beim Ausführen nach einem Wert für y.Part_No_ da dies unbekannt ist (Access).

    PS, allein die StDev für ein Teil zu bekommen hat mich min. 20Std gekostet... Bin stolz drauf, aber jetzt häng ich...
    Hoffentlich ist Hilfe Unterwegs...

  • #2
    Hallo,

    mir fällt folgendes dazu ein (nicht getestet):

    Code:
    select Part_No_, stdev(F1) as F2
    from(
        select Part_No_, sum(QTY) as F1
        from 10a_Invoices where year(Invdate) = 2007
        group by Part_No_, month(Invdate)
    )
    group by Part_No_
    Erklärung: im inneren Select wird nach 2 Kriterien gruppiert, Artikelnummer und Monat. Der Rechnungsbetrag wird also für jeden Artikel und jeden Monat summiert. Das Ergebnis wird vom äußeren Select nach Artikelnummer gruppiert und daher erhält man für jede Gruppe - also jeden Artikel - die Standardabweichung der Monatssumme.

    Hoffe, es klappt!

    Gruß,

    Anja
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Noch jemand der nicht schlafen kann...

      Witzig, gerade eben hab ich kurz an was ähnliches gedacht.
      Probier ich aus.

      Vielen Dank
      Daniel

      Kommentar


      • #4
        Nee...
        Sorry. Hat ich doch schon versucht.
        Werde nach Eingabe für Part_No_ gefragt.

        Das Problem ist, dass die Abfrage die Standardabeichung errechnet wobei Teile und Monate gruppiert wird. Es wird von der Unterabfrage also nur ein Wert errechnet (Die Unterabfrage ist Unabhängig von der äußeren. Und die Beiden zu verknüpfen geht daher nicht (?)). Und dieser einzige Wert der Unterabrage gilt dann als F2 für alle Artikel in der äußeren Join.

        Das Erg ist also
        Artikel | Stdev
        A | 233
        B | 233
        C | 233
        D | 233
        (als Annahme eben daß der gewählte Artikel 233 als Stdev hat)
        Zuletzt geändert von Danusus; 25.08.2009, 00:41.

        Kommentar


        • #5
          Zitat von Danusus Beitrag anzeigen
          Werde nach Eingabe für Part_No_ gefragt.
          Von wem?

          Kannst du mal bitte die Tabellenstruktur posten, z. B. "show create table ..."?
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Sorry, hatte nen Fehler drin, nach dem Subselect fehlte das Alias:
            Zitat von AmicaNoctis Beitrag anzeigen
            Code:
            select Part_No_, stdev(F1) as F2
            from(
                select Part_No_, sum(QTY) as F1
                from 10a_Invoices where year(Invdate) = 2007
                group by Part_No_, month(Invdate)
            ) AS temp
            group by Part_No_
            Ansonsten inzwischen erfolgreich getestet. Mein Setting:
            Code:
            CREATE TABLE IF NOT EXISTS `art` (
              `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
              `art` varchar(1) NOT NULL,
              `menge` int(10) unsigned NOT NULL,
              `datum` date NOT NULL,
              PRIMARY KEY (`id`)
            );
            Code:
            insert into art (art, menge, datum) values
            (char(floor(rand() * 26 + 97)), rand() * 100, date_sub(now(), interval rand() * 100 day)),
            (char(floor(rand() * 26 + 97)), rand() * 100, date_sub(now(), interval rand() * 100 day)),
            ...
            (char(floor(rand() * 26 + 97)), rand() * 100, date_sub(now(), interval rand() * 100 day));
            Code:
            select *, stddev(sm), group_concat(sm) from (
                select *, sum(menge) as sm, group_concat(menge) as gcm, group_concat(datum) as gcd
                from `art`
                group by art, month(datum)
            ) as t1
            group by art
            (Die ganzen group_concats sind nur zum Nachprüfen gewesen.)
            Zuletzt geändert von AmicaNoctis; 25.08.2009, 01:17.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Gr8

              Funktioniert.
              Vielen Dank. Hat dich n bischen weniger Zeit gekostet als mich...

              Ich war knapp dran, ich hätte es aber auf diese Weise gar nicht versucht.
              Woher weiss die Unterabfrage denn, dass sie die Werte der Teilenummer zuordnen muss? Die Unterfrage baut doch eine 2te Tabelle auf in der Part_No_ und die QTYs stehen. Diese ist aber doch völlig unabhängig von der Darueberliegenden - oder denk ich da in die falsche Richtung?

              Ich bin ständig davon ausgegangen, dass ich etwas in Richtung y.Part_No_=yy.Part_No_ einbauen muss. (mit y die Unterabfrage und yy die Uebergeordnete - Geht ja aber hier nicht weil die Tabelle nur einmal angegeben wird- Oder liegts daran?).

              So... jetzt aber erst mal ne Woche SQL-Urlaub. Wenn ich zurück bin bastel ich mal weiter und bau die 2te Tabelle mit Monaten ein, damit ich die Stdev über alle 12Monate laufen lassen kann. ..... Aber bis dahin hast Du ja dann bestimmt auch schon nen Lösungsvorschlag ;-)

              Vielen Dank nochmal. War wirklich ne große Hilfe.

              PS
              Von wem? Access... (Da hab ich verschiedene Abfrage-Tabellen wobei die dann eine nach der anderen die Abfragen aufbauen. Damit hab ich die Ergebnisse erhalten, die ich wollte. Irgendwann hab ich aber vor lauter Abfragen die Übersicht verloren... So ne kleine Query hat da dann doch was für sich.

              Kommentar


              • #8
                Zitat von Danusus Beitrag anzeigen
                Aber bis dahin hast Du ja dann bestimmt auch schon nen Lösungsvorschlag ;-)
                Wofür jetzt genau?

                Ach, du machst das mit Access? Ich bin von PHP und MySQL ausgegangen... Dann ist es schon erstaunlich, dass das so funktioniert.
                Zuletzt geändert von AmicaNoctis; 25.08.2009, 23:21.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Tja, die unerforschten Weiten des Access...
                  Nehm fürs Web auch PHP&MySQL aber für Business-Sachen ist Access eben doch nicht schlecht. Das gute alte Office hat eben jeder auf seinem PC installiert...

                  Hab im anderen Threat nach dem kurzen Raubzug (Xampp) das lmgtfy zum ersten Mal gesehen :-). Bin da wohl der Zeit hinterher, aber bringt zum schmunzeln... solange man nicht der ist, der den Link bekommt...
                  Den Threat hab ich übrigens gefunden nachdem ich mich ein wenig umgeschaut habe, wer mir innerhalb ein paar Minuten eine Lösung schickt an der ich tagelang erfolgsverschont rumgewurschelt hab. Sorry aber, dass ich bei den Fragen nicht helfen kann...

                  Wofür denn jetzt genau?... (Ich find irgendwie den Knopf nicht für die Zitate)
                  Ah hier ist er ja:
                  Zitat von AmicaNoctis Beitrag anzeigen
                  Wofür jetzt genau?
                  Momentan rechnet die Stdev nur die Monate in denen es auch wirklich was gab. Also wenn es Jan, Feb und Jul 100,200,500 gab dann Stdev(100,200,500). Jetzt soll aber Stdev(100,200,0,0,0,0,500,0,0,0,...) berechnet werden (Von 12 Monaten oder eben der Zeitraum den man angibt).
                  Also in die Richtung
                  Select ....... from Invoices, Months (und nicht mehr nur von Invoices)

                  Ich bekomm das aber glaub ich hin. Aber wie gesagt - in der unendlichen Weite meiner Abfragensammlung find ich das schon irgenwie und ich muss das ja nun nur noch die vorhandene Abfrage erweitern.

                  CU
                  Daniel
                  Zuletzt geändert von Danusus; 25.08.2009, 23:52.

                  Kommentar

                  Lädt...
                  X