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:-)

  • Falk Prüfer
    replied
    Alles gesagt... => Close!

    Leave a comment:


  • ebis
    replied
    siehe auch

    Leave a comment:


  • Falk Prüfer
    replied
    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!

    Leave a comment:


  • defo
    replied
    Dann mach es doch so, wie Falk geschrieben hat.

    Leave a comment:


  • claudine99
    replied
    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.

    Leave a comment:


  • defo
    replied
    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.

    Leave a comment:


  • Falk Prüfer
    replied
    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

    Leave a comment:


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

    Leave a comment:


  • claudine99
    replied
    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

    Leave a comment:


  • emetiel
    replied
    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

    Leave a comment:


  • defo
    replied
    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.

    Leave a comment:


  • claudine99
    replied
    Hallo Defo,

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

    Leave a comment:


  • defo
    replied
    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]

    Leave a comment:

Working...
X