SQL vergelijking in query

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Scheepers.A
  • Registratie: Februari 2019
  • Laatst online: 16-03-2022
Mijn vraag:
Tabel Uitslag heeft een veld Uitslagwaarde die gedefinieerd staat als nvarchar(20) vanwege dat er tekst als uitslagen met dubbele precisie in staat.
In de query heb ik de uitslag al op decimal gezet, maar nu komt het.
Ik moet een vergelijking doen
- de uitslag < 50 en ouder dan 10 jaar is
- de uitslag < 150 en jonger dan 11 jaar is

Dit lukt mij nog niet.

De query:
SQL:
1
2
3
4
5
6
7
8
9
SELECT        U.MonsterNummer, U.TestCode, A.PrikDatum, 
CASE 
WHEN isNumeric(U.UitslagWaarde) <> 0 THEN CONVERT(decimal(10, 2), CONVERT(nvarchar(20), 
                         REPLACE(U.UitslagWaarde, ',', '.'))) 
ELSE U.UitslagWaarde END AS Uitslag,
A.PatientGebDat,DATEDIFF(hour,A.PatientGebDat,GETDATE())/8766 AS Leeftijd
FROM            Uitslag AS U INNER JOIN
                         Aanvraag AS A ON A.MonsterNummer = U.MonsterNummer
WHERE        (U.MonsterNummer = '100029214195') AND (U.TestCode = 'ige')

[ Voor 0% gewijzigd door RobIII op 05-03-2020 13:10 . Reden: Code tags toegevoegd ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Scheepers.A schreef op donderdag 5 maart 2020 @ 12:31:
Uitslagwaarde die gedefinieerd staat als nvarchar(20) vanwege dat er tekst als uitslagen met dubbele precisie in staat.
...en toen ben ik even gestopt met verder lezen. Why? 8)7 Waarom gebruik je geen float, decimal o.i.d.? Ik zou dat éérst eens aanpakken, de rest is peanuts. Maar je query wordt er nu niet bepaald heel overzichtelijk op door de converts en replaces etc.

[ Voor 18% gewijzigd door RobIII op 05-03-2020 13:11 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Die query is nog niet te lezen
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT  U.MonsterNummer,
        U.TestCode,
        A.PrikDatum, 
        CASE 
            WHEN isNumeric(U.UitslagWaarde) <> 0 
            THEN CONVERT(decimal(10, 2), CONVERT(nvarchar(20), 
                     REPLACE(U.UitslagWaarde, ',', '.'))) 
            ELSE U.UitslagWaarde
        END AS Uitslag,
        A.PatientGebDat,
        DATEDIFF(hour,A.PatientGebDat,GETDATE())/8766 AS Leeftijd
FROM Uitslag AS U
INNER JOIN Aanvraag AS A ON A.MonsterNummer = U.MonsterNummer
WHERE (U.MonsterNummer = '100029214195') AND (U.TestCode = 'ige')


Als antwoord op je vraag: Dat lijkt me een standaard AND en OR constructie met wat ronde haken?
code:
1
... AND ((Uitslag < 50 AND Leeftijd > 10) OR (Uitslag < 150 AND Leeftijd < 11))

Overigens zou je de Uitslag-value beter iets anders noemen, aangezien je ook al een tabel Uitslag hebt....

[ Voor 68% gewijzigd door Vaan Banaan op 05-03-2020 13:31 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Scheepers.A
  • Registratie: Februari 2019
  • Laatst online: 16-03-2022
Het is een database die al een aantal jaren bestaat en niet gewijzigd wordt door beheer

Acties:
  • 0 Henk 'm!

  • Joostje123
  • Registratie: September 2010
  • Laatst online: 02-07 09:09
ALTER TABLE Uitslag
MODIFY Uitslagwaarde float;

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Scheepers.A schreef op donderdag 5 maart 2020 @ 14:42:
Het is een database die al een aantal jaren bestaat en niet gewijzigd wordt door beheer
Dan laat je Beheer toch lekker dit oplossen of de queries maken?

De oorzaak van het probleem is duidelijk zat.

Het klinkt behoorlijk als medische gegevens, dus dat het datamodel rammelt, beheer niet optreedt, en jij sinds november met zelfde query stoeit... Met alle respect, maar tegengas geven en iemand de verantwoordelijkheid laten nemen is dan denk de beste optie.

{signature}


Acties:
  • +1 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 10:20

Rannasha

Does not compute.

Scheepers.A schreef op donderdag 5 maart 2020 @ 14:42:
Het is een database die al een aantal jaren bestaat en niet gewijzigd wordt door beheer
Dan ga je eerst bij beheer klagen dat hun datamodel rammelt.

En als je dan geen nuttige reactie krijgt, dan kun je een view gaan bouwen waarin je al die conversies achter de schermen laat doen. De view heeft dan een uitslag-kolom dat wel gewoon een numerieke waarde is en eventueel een leeftijd-kolom.

Zodra je je niet druk hoeft te maken over de conversies en tussen-berekeningen, wordt het al snel een stuk duidelijker hoe de daadwerkelijke query er uit moet komen te zien.

|| Vierkant voor Wiskunde ||


Acties:
  • +1 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 12-06 21:58
Het is geen antwoord op je vraag (dat staat hierboven al), maar
realiseer je je dat je de leeftijd berekent op het moment van opvragen, niet op het moment waarop de test is uitgevoerd.

Verder zijn de categorieën ouder dan tien, en jonger dan 11, niet wederzijds uitsluitend. Iemand die 10 jaar en 6 maanden oud is is beide.

En, in welke SQL-variant doe je dit? Ik vind de manier om de leeftijd uit te rekenen nogal bijzonder.

Acties:
  • +1 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Die hele query lijkt sowieso een samenraapsel van wat zoektermen.
https://stackoverflow.com...date-of-birth-and-getdate

Maar als je dat ding al wilt gebruiken, moet je inderdaad de PrikDatum gebruiken in plaats van GETDATE() om de leeftijd ten tijde van de test te bepalen.

Het gaat blijkbaar om SQL server 2017

[Ik ben er wel klaar mee]
Ik denk niet dat de TS hier nog gaat reageren
Topic openen, snippets neerplempen in borked layout, "doet het niet", repeat

500 "The server made a boo boo"

Pagina: 1