none
Mit SQL die letzte Ziffer einer Zahl beeinflussen RRS feed

  • Frage

  • Hallo Zusammen,

    ich bin ein blutiger Anfänger und möchte gerne ein Berechnetes Feld erstellen.

    In diesem Feld soll der Wert aus dem Feld Distanz gerundet werden und zwar so, dass entweder die Endziffer 1 oder 6 dabei heraus kommt

    Was ich habe ist die letze Ziffer

    select Distanz

    ,convert(bigint,left (Distanz, (len (Distanz)-1))) as Links2

    from [dbo].[tblDst_platts]

    nun versuche ich eine If schlaufe einzubauen.

    keine Ahnung wie das geht

     if right([dbo].[tblDst_platts].[Distanz],1) <=5
    select 1 ;
    else
    Select 6 ;
    from [dbo].[tblDst_platts]

    kann mir jemand heflen dabei?

    Gruss Snoopy

    Dienstag, 15. August 2017 14:14

Antworten

  • Es gäbe da noch eine einfachere Variante:

    round(Distanz / 5, 0) * 5 + 1

    oder, falls negative Zahlen vorkommen können:

    round(distanz / 5, 0) * 5 + 1 * (coalesce(abs(distanz) / nullif(distanz)), 0)

    Der Round rundet auf 0 oder 5, dazu kommt die 1 für 1 oder 6.
    Im Negativfall kalkuliert man das Vorzeichen "abs(distanz) / distanz", da es keine SIGN(Wert)-Funktion gibt.
    Da Division durch 0 nicht erlaubt ist, also NULLIF, was dann NULL ergibt und mittels coalesce auf 0 gesetzt wird.
    Daher wird bei Positiv 1 addiert, bei Negativ 1 subtrahiert und bei 0 bleibts bei 0.


    Mittwoch, 16. August 2017 12:51
  • Hallo Zusammen,

    erstmals herzlichen DAnk für die Hilfe

    ich habe die Version mit Round eingesetzt und es rennt!!!

    Ich danke allen für die Hilfe.

    bin echt froh

    Gruss

    Snoopy

    Mittwoch, 16. August 2017 14:35

Alle Antworten

  • case when Distanz % 10 <= 5
    then floor(Distanz / 10) * 10 + 1
    else floor(Distanz / 10) * 10 + 6
    end

    Dienstag, 15. August 2017 14:45
  • case when Distanz % 10 <= 5
    then floor(Distanz / 10) * 10 + 1
    else floor(Distanz / 10) * 10 + 6
    end

    Moin,

    da man nicht weiß, wie große Werte da vorkommen können, ist man mit dem Dividieren nicht sonderlich erfolgreich. Besser ist da, mit dem mod-Operator zu arbeiten, denn 13 mod 10 ergibt ebenso 3 wie 713 mod 10. Das gilt allerdings nur, wenn die Angaben ganze Zahlen sind, sonst muß man sie zunächst runden.

    Gruß

    Johannes

    Mittwoch, 16. August 2017 09:48
  • Es gäbe da noch eine einfachere Variante:

    round(Distanz / 5, 0) * 5 + 1

    oder, falls negative Zahlen vorkommen können:

    round(distanz / 5, 0) * 5 + 1 * (coalesce(abs(distanz) / nullif(distanz)), 0)

    Der Round rundet auf 0 oder 5, dazu kommt die 1 für 1 oder 6.
    Im Negativfall kalkuliert man das Vorzeichen "abs(distanz) / distanz", da es keine SIGN(Wert)-Funktion gibt.
    Da Division durch 0 nicht erlaubt ist, also NULLIF, was dann NULL ergibt und mittels coalesce auf 0 gesetzt wird.
    Daher wird bei Positiv 1 addiert, bei Negativ 1 subtrahiert und bei 0 bleibts bei 0.


    Mittwoch, 16. August 2017 12:51
  • Hallo Zusammen,

    erstmals herzlichen DAnk für die Hilfe

    ich habe die Version mit Round eingesetzt und es rennt!!!

    Ich danke allen für die Hilfe.

    bin echt froh

    Gruss

    Snoopy

    Mittwoch, 16. August 2017 14:35
  • Kannst du das dann noch als Antwort bestätigen, bitte?
    Mittwoch, 16. August 2017 15:38