Announcement

Collapse
No announcement yet.

kompliziertes SELECT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • kompliziertes SELECT

    Hallo,
    ich bin neu hier und auch erst seit kurzem in der Branche, deswegen hab ich leider noch nicht die Routine wie viele von euch hier
    Für viele ist dieses SELECT wahrscheinlich einfach, aber ich bin am verzweifeln:

    So sieht ein Teil meiner table aus:
    Code:
    Land      | Artikel  | Farbe    | Preis    | PreisRed |
    AUT       | 4711     | 0        | 7999     | 0        |
    AUT       | 4711     | 1        | 0        | 2499     |
    DEU       | 4711     | 0        | 7900     | 0        | ... usw
    Mal zur Erläuterung:
    In [Land] stehen ISO3 Ländercodes, jeder Artikel muss einen Preis in jedem Land haben. Die Farbe ist default 0 außer er hat einen reduzierten Preis, dieser gilt nur für einen bestimmten Artikel in einem bestimmten Land.
    Der Primary Key ist somit Land, Artikel, Farbe

    Ich hätte nun gern ein SELECT, dass mir nur Artikel ausgibt, welche auch einen Preis in jedem Land haben. Dann gibts noch die reduzierten Preise, die auch nur ausgegeben werden dürfen, wenn der "Hauptartikel" (mit Farbe 0) in jedem Land vorkommt.

    Ich habe mir gedacht, das ich statisch für jedes Land 2 Spalten anlege:
    Code:
    select artikelnr, farbe,
       sum((case when (land = 'AUT' and farbe = 0) then preis end)) AS AUTPREIS,
       sum((case when (land = 'AUT' and farbe <> 0) then preisreduziert end)) AS AUTREDPREIS,
       sum((case when (land = 'DEU' and farbe = 0) then preis end)) AS DEUPREIS,
       sum((case when (land = 'DEU' and farbe <> 0) then preisreduziert end)) AS DEUREDPREIS,
       sum((case when (land = 'CHE' and farbe = 0) then preis end)) AS CHEPREIS,
       sum((case when (land = 'CHE' and farbe <> 0) then preisreduziert end)) AS CHEREDPREIS
    from preise
    
    group by artikelnr, farbe
    
    having AUTPREIS is not null and DEUPREIS is not null and CHEPREIS is not null;
    So weit bin ich nun, nur leider hab ich die reduzierten Preise noch nicht konform da drin (keine Abfrage auf Hauptartikel) ... habs zwar mit einem
    Code:
    farbe <> 0 and artikelnr in (SELECT ...)
    probiert, nur leider ist das soooo unperformat, das ich einen Timeout bekomme (ist ja auch verständlich ^^). Mir ist btw auch egal, wenn keine extra Spalten angelegt werden (was wl auch performanter und "besser" wäre, nur scheitert hier meine Logik).
    TL;DR: Wichtig ist nur, dass Artikel in jedem Land einen Preis haben und eine Preisreduktion nur ausgegeben wird, wenn die Artikelnr mit Farbe 0 in jedem Land vorkommt.

    Könnte mir jemand da weiter helfen?
    Ich bräuchte eine performante Lösung, da es sich hier um ~400.000 DS handelt.

    Vielen Dank im vorraus!
    LG Shoox

    PS: Es gibt nur 3 mögliche Länder: AUT, CHE und DEU.
    PPS: mySQL-DB im Hintergrund, aber ich glaube, dass das in diesem Fall irrelevant ist.
    Zuletzt editiert von Shoox; 01.12.2010, 09:33. Reason: DBMS vergessen

  • #2
    keiner einen Vorschlag? =(

    Comment


    • #3
      Originally posted by Shoox View Post
      keiner einen Vorschlag? =(
      Vlt. hats einfach nur keiner verstanden - also ich werde z.B. aus:
      Originally posted by Shoox View Post
      ..., nur leider ist das soooo unperformat, das ich einen Timeout bekomme (ist ja auch verständlich ^^). Mir ist btw auch egal, wenn keine extra Spalten angelegt werden (was wl auch performanter und "besser" wäre, nur scheitert hier meine Logik).
      TL;DR: Wichtig ist nur, dass Artikel in jedem Land einen Preis haben und eine Preisreduktion nur ausgegeben wird, wenn die Artikelnr mit Farbe 0 in jedem Land vorkommt.
      nicht schlau.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Danke mal für die Antwort,
        also, ich möchte ein SELECT das mir nur Artikel ausgibt, welche in jedem Land vorkommen. Also gleiche Artikelnummer in den 3 verschiedenen Ländern mit der Farbe 0. 0 ist sozusagen default-wert.
        Jetzt ist es möglich, dass ein Artikel in einem oder mehreren Ländern in einer gewissen Farbe reduziert ist. Ich möchte die aber so rausfiltern, dass diese nur ausgegeben werden, wenn die gleiche Artikelnummer mit der Farbe 0 in allen Ländern vorkommt. Sry, wenn es noch unverständlich ist, aber ich kanns leider nicht besser erklären.

        Wie das Ergebnis "aussieht" ist mir eigentlich egal, es kann so wie mein Beispiel oben gelöst werden oder irgendwie anders :P

        Zur weiteren Erklärung: In dieser Tabelle sind ein Haufen (für mich) unbrauchbare Artikel drin. Diese werden nml von einer Firma bereitgestellt die noch andere Sachen damit macht. Weiters ist diese Artikelnummer die da drin ist, nur ein Teil der ganzen - die Ganze setzt sich aus eben dieser Artikelnummer + Farbe + Größe zusammen. Deswegen schreibt mir die Firma da eine 0 rein, damit ich weiß, dass der Preis für die ganze "Artikelgruppe" gilt und nicht für einen speziellen Artikel.
        Die Preisreduktion wird extra für jede Farbe gemeldet, dh selbst wenn die ganze "Artikelgruppe" zB in Österreich nun billiger wäre, würde für jede Farbe ein Datensatz da drin sein.

        Ich hoffe ich konnte es nun ein bisschen verständlicher erklären =)

        Comment


        • #5
          Hallo,

          also wenn ich dich richtig verstanden habe, dann wären das hier:
          [highlight=sql]
          select Artikel
          from <table>
          where Farbe = 0
          and Land in ('AUT', 'CHE', 'DEU')
          group by Artikel
          having count(DISTINCT Land) = 3
          [/highlight]
          alle Artikel, die einen "Default" in allen drei Ländern haben.
          Diese Abfrage sollte sich jetzt als Subselect in einer weiteren Query verwenden lassen.
          [highlight=sql]
          select a.Artikel, a.Farbe, a.Preis, a.PreisRed
          from <table> a
          inner join (
          select Artikel
          from <table>
          where Farbe = 0
          and Land in ('AUT', 'CHE', 'DEU')
          group by Artikel
          having count(DISTINCT Land) = 3) b on b.Artikel = a.Artikel
          [/highlight]
          Inwieweit das jetzt Performant ist, kann ich dir nicht sagen, da es stark von deiner Hardware, dem eingesetzten DBMS, evtl. vorhandenen Indizes etc. abhängt.

          Gruß Falk

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo, sry für die späte Meldung, hab das Problem ein bisschen nach hinten verschieben müssen. Zuerst hat dein SQL Falk Prüfer auch einen Timeout bekommen, aber ich hab ein paar Indizes hinzugefügt und jz funktionierts. Vielen Dank =) Ihr habt mir viel Kopfzerbrechen erspart.

            Comment

            Working...
            X