Announcement

Collapse
No announcement yet.

3. Integer Wert unter einer Bedingung ausgeben

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 3. Integer Wert unter einer Bedingung ausgeben

    Hallo liebe Leute,

    ich habe folgendes Problem:

    in der Spalte x steht abcedf (varchar), dann soll der dritte Wert (integer) aus der Spalte y ausgegeben werden, wenn in x nicht abcdef steht, dann der erste

    Könnte mir hier bitte jemand dazu helfen?

    Viele Grüße und Danke:-)

  • #2
    Wie ist denn Spalte y aufgebaut, woraus bildet sich in der Spalte y der 3. oder 1. Wert?

    Vorschlag (das Substring musst du ggF an Deinen Aufbau anpassen):
    [highlight=sql]
    SELECT CASE
    WHEN T.X = 'abcdef' THEN
    SUBSTRING(T.y, 3, 1)
    ELSE
    SUBSTRING(T.y, 1, 1)
    END
    FROM Table T
    [/highlight]
    Gruß, defo

    Comment


    • #3
      Hallo Defo,

      leider geht Substring nicht, weil Spalte y den Datentyp integer hat:-(
      Grüße Claudia

      Comment


      • #4
        Originally posted by claudine99 View Post
        Hallo Defo,

        leider geht Substring nicht, weil Spalte y den Datentyp integer hat:-(
        Grüße Claudia
        Tja, ich hab ja schon geschrieben, dass Deine Schilderung etwas dünn ist. Immerhin wissen wir jetzt, nicht der 3. Wert der Spalte, sondern die Spalte selbst ist vom Typ Integer. Aber was bitte schön soll der 3. Wert eine Integerspalte sein?
        Beispieldaten sind immer anschaulich, am besten gleich für mehrere, verschiedene(!) Datensätze.
        Gruß, defo

        Comment


        • #5
          Originally posted by claudine99 View Post
          leider geht Substring nicht, weil Spalte y den Datentyp integer hat:-(
          Das geht sehr wohl, dazu muss nur die Spalte mit cast in varchar umgewandelt werden

          z.B.:
          Code:
          SELECT CASE
                   WHEN T.X = 'abcdef' THEN
                    SUBSTRING( cast( T.y as varchar( 10 ), 3, 1 )       
                   ELSE
                    SUBSTRING( cast( T.y as varchar( 10 ), 1, 1 )       
                 END
            FROM TABLE
          Die Länge von 10 musst Du dann halt entsprechend Deiner Tabelle anpassen

          Comment


          • #6
            Hallo Defo,
            es geht hier um Maschinen und Versionen.

            Die Tabelle hat unter anderem die Spalten Version und MSN. Alle Versionen sind so gültig, wie in der Tabelle festgelegt, ausser eine.

            Bsp.

            Version MSN

            abcd 5

            efgd 7

            abcd 9

            mnjk 10

            abcd 23

            efgd 9

            Nun soll von der Version "abcd" die MSN aber erst mit der 23 ausgegeben werden und die beiden ersten "missachtet", bzw. dürfen gar nicht ausgegeben werden.

            Ich hoffe, da war verständlich:-)

            Viele Grüße

            Claudia

            Comment


            • #7
              Hallo Emetiel,
              umwandeln darf ich leider nicht, weil die Programme, die diese View nutzen, dann nicht mehr funktionieren...
              Viele Grüße

              Comment


              • #8
                Hallo,
                Originally posted by claudine99 View Post
                ...Nun soll von der Version "abcd" die MSN aber erst mit der 23 ausgegeben werden und die beiden ersten "missachtet", bzw. dürfen gar nicht ausgegeben werden.
                SQL arbeitet Mengenorientiert, d.h. soetwas wie "Erster" oder "Zweiter" gibt es nicht, bzw. entsteht erst durch die Angabe einer speziellen Sortierung. Löse dich von der sequentiellen Orientierung und versuche dein Problem als Menge zu beschreiben und es wird sich mit SQL lösen lassen .

                [highlight=sql]
                select Version, max(MSN) last_msn
                from <tabelle>
                where Version = 'abcd'
                group by Version
                [/highlight]
                Wäre eine Lösung für dein konkretes Beispiel, ob das aber deine Aufgabe generell löst weiß ich nicht. Dafür ist deine Problemstellung zu ungenau.

                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


                • #9
                  Ok, hab ich also vollkommen falsch spekuliert, es geht nicht um eine Differenzierung innerhalb eines Datensatzes, sondern reines Filtern.
                  Dein "3. Wert" meint den 3. Datensatz.

                  Das klingt nach Reihenfolge, also Order By, ist aber für diese Anforderung vollkommen egal, zumindest nach Deinen letzten Erläuterungen. Dein Kriterium ist ganz klar: Satz mit Version 'abcd' und MSN 5 oder 9 müssen rausgefiltert werden.

                  [highlight=sql]where not (Version = 'abcd' and MSN in (5,9))[/highlight]

                  3. oder andere Werte interessieren SQL idR nicht. SQL arbeitet mengenorientiert. Ein Select erzeugt ohne Verwendung von ORDER BY eine Ausgabe in zufälliger, nicht fester, nicht reproduzierbarer Reihenfolge, auch wenn es meist anders aussieht. (Nur falls du zufällig doch mit Sortierung arbeiten musst)

                  Tipp für später:
                  Die Daten riechen danach, dass sie 'leben'. Hier wäre m.E. eine weitere Spalte sinnvoll, die per Flag anzeigt, in welchem Kontext, Status der jeweilige Datensatz steht. Diese Flags werden dann bei neuen Versionen angepasst, nicht das SQL Statement. Das könnte von da an einfach lauten 'where status = 'A(ktiv)' oder so.

                  P.S.: Ah, da hat Falk auch schon was geschrieben- vor allem was ganz anderes . Da sieht man, wie unklar eine Frage formuliert werden kann.
                  Naja, ich lass es mal so stehen, vlt nützt es irgendjemand.
                  Gruß, defo

                  Comment


                  • #10
                    Hallo,
                    also MSN not in (5,9) funktioniert so nicht, da tgl. neue Daten importiert werden.
                    Problem ist gelöst über RowNumber:-)

                    SELECT MSN ,
                    ImportDate ,
                    yyy ,
                    Version ,
                    ROW_NUMBER() OVER ( PARTITION BY yyy ORDER BY yyy DESC ) AS RN
                    FROM tablem
                    WHERE Version = 'abcdef';



                    Viele Grüße
                    Zuletzt editiert von claudine99; 10.07.2012, 13:24.

                    Comment


                    • #11
                      Dann mach es doch so, wie Falk geschrieben hat.
                      Gruß, defo

                      Comment


                      • #12
                        Hmm... du sagst immer nur
                        Originally posted by claudine99 View Post
                        ...funktioniert so nicht
                        und kommst mit den Infos Häppchenweise...

                        Originally posted by claudine99 View Post
                        ...so dass bei der Version 'abcdef' der erste und der zweite Datensatz nicht ausgegeben werden
                        Wie nun schon mehrfach gesagt, gibt es bei SQL KEINEN "Ersten" oder "Zweiten" Datensatz. Hier müsstest du wenigstens noch die Sortierregel angeben, aus der sich die Reihenfolge ergibt. Geht es zudem wirklich darum, den "Ersten" und "Zweiten" auszusortieren (und ggfs. einen Dritten und Vierten und Fünften... anzuzeigen) oder soll jeweils nur der "Letzte" angezeigt werden? Dies macht für drei Datensätze zwar keinen, für die Abfrage aber einen bedeutenden Unterschied!
                        Auf alle Fälle wird es wohl darauf hinauslaufen, eine separate Abfrage für die "normalen" Datensätze zu machen und mit einem UNION den Sonderfall 'abcdef' hinzuzufügen.

                        Gruß Falk

                        P.S.: Ach ja und bitte Formatierung von SQL in Beiträgen beachten!
                        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


                        • #13
                          siehe auch

                          Comment


                          • #14
                            Alles gesagt... => Close!
                            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

                            Working...
                            X