Beregninger og konstante værdier

I SQL-sproget kan du indsætte konstante værdier som en kolonne, og du kan lave beregninger direkte i en forespørgsel. Beregninger og indsættelse af konstante kolonneværdier er nyttigt i flere situationer. Enten fordi der er krav om, at der leveres eksempelvis en pris med moms, men værdien er skrevet uden moms. Eller der kan være et ønske om, at alle rækker har en kolonne med en bestemt oplysning, f.eks. for at identificere data i forbindelse med samkøring af data fra flere kilder.

Når du ændrer en kolonnes oprindelige værdi eller indsætter en kolonne med konstant værdi, vil SQL Server ikke længere give dig navnet på kolonnen. Det er der umiddelbart to grunde til: For det første kan det give dataforvirring, hvis en kolonne har samme navn, men en ny værdi, og for det andet kan beregningen indeholde flere kolonner, og det er så ikke tydeligt hvilket kolonnenavn, der skal bruges. Derfor navngiver/omdøber jeg konsekvent kolonner, der laves beregninger på. Se mere om at omdøbe og navngive kolonner i denne lektion.

Sådan beregner du moms på priskolonne

Et ganske åbenlyst eksempel er at lave en momsberegning af priskolonnen i varetabellen. Momsen i Danmark (i skrivende stund) er 25%. Vi skal altså gange prisen med 1,25. Gangetegnet i SQL Server er *. Det skal ikke forveksles med * i forbindelse med visning af alle kolonner i en SELECT.

SELECT
  Varenr,
  Varebetegnelse,
  Pris PrisUdenMoms,
  Pris*1.25 PrisMedMoms
FROM Vare

Konstante værdier i en kolonne

Det kan være nødvendigt eller bare praktisk at have en eller flere kolonner med kontante værdier i. Det er supernemt, du skal bare skrive værdien som var det et felt. Tekstværdier skal skrives i apostroffer.

Dette eksempel skriver en kolonne med teksten Boblekuvert TILBUD og laver dertil en kolonne med værdien 50, som er den rabatprocent, der ydes. Selvfølgelig beregnes prisen også.

SELECT
  'Boblekuvert TILBUD' Tilbudsinformation,
  50 Rabatprocent,
  Varebetegnelse,
  Pris NormalprisUdenMoms,
  Pris*0.5 TilbudsprisUdenMoms
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Tekstfelter kan også manipuleres

Du kan også manipulere tekstfelter, f.eks. ved at lægge en tekst til, eller bruge en tekstfunktion til at afkorte eller på anden måde ændre værdien. Her skriver vi Halv pris! foran varebetegnelsen.

SELECT
  'Boblekuvert TILBUD' Tilbudsinformation,
  'Halv pris! ' + Varebetegnelse Varebetegnelse,
  Pris NormalprisUdenMoms,
  Pris*0.5 TilbudsprisUdenMoms
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Regnearter og funktioner

SQL Server kender de almindelige regnearter og har en masse indbyggede funktioner til forskellige formål. Denne forespørgsel viser de fire regnearter og eksempler på et par indbyggede funktioner.

  • SIGN(værdi): Viser fortegnet af værdien. -1 negativ, 0 nul, 1 positiv.
  • ROUND(værdi, antaldecimaler): afrunder værdien til det ønskede antal decimaler.
  • RAND(): viser et tilfældigt tal mellem 0 og 1. Bemærk, at der ikke beregnes en ny værdi i hver række!
SELECT
  Pris,
  Pris*2 Multiplikation,
  Pris/2 Division,
  Pris+2 Addition,
  Pris-0.2 Subtraktion,
  SIGN(Pris) FortegnPostiv,
  SIGN(-Pris) FortegnNegativ,
  SIGN(0) FortegnNul,
  ROUND(Pris/7, 4) Afrund4decimaler,
  ROUND(Pris/7, 2) Afrund2decimaler,
  RAND() Tilfældig
FROM Vare
WHERE Varenr LIKE 'BOBA%'

Prøv selv

  • I Ordrelinje-tabellen er der antal, pris og rabat (i kroner pr. enhed). Lav en kolonne, der viser totalen.
  • Lav en forespørgsel med en Varebetegnelse-kolonne, hvor varenummer skrives i parentes efter varebetegnelsen. Kolonnens navn skal stadig være Varebetegnelse.
  • Funktionen DATEDIFF beregner tidsrum mellem to datoer. Første parameter er enheden. Brug DATEDIFF(enhed, dato1, dato2) og GETDATE() til at finde ud af, hvor mange dage (parameter hedder d), der er siden ordrerne i Ordre-tabellen er oprettet.
    I løsningen i videoen er der også løsning på antal timer, uger og måneder.

Omdøbe felter og tabeller med AS

SQL-sproget har en indbygget kommando til at omdøbe felter og tabelnavne i resultatet. Det sker med AS-kommandoen. Som du skal se, tillader SQL endda, at du sparer de par tastetryk, der skal til at skrive AS.

Omdøbning af tabelnavne er i sandhed en stor fordel, når man arbejder med flere tabeller. Se nærmere i kapitlet om JOIN (link kommer). Men det er også en måde at give et navn til en kolonne i et resultat med beregnede værdier.

Sådan omdøbes felt eller kolonne i SQL

I SQL skriver du AS og det nye navn lige efter kolonne- eller tabelnavn.

SELECT
  Kolonne1 AS Nytkolonne1navn,
  Kolonne2 AS Nytkolonne2navn
FROM Tabel AS Nyttabelnavn

I dette eksempel omdøbes feltet Navn i Kunde-tabellen til Kundenavn. Feltet Bynavn påvirkes ikke.

SELECT Navn AS Kundenavn, Bynavn
FROM Kunde

Tabellen kan omdøbes sådan her, men det ses ikke umiddelbart i resultatet.

SELECT Navn
FROM Kunde AS Kundetabel

Brug af kvalificeret navngivning med punktum

Senere, når vi arbejder med flere tabeller i en forespørgsel bliver det nødvendigt at angive eksakt feltnavn ved at henvise til tabelnavn og feltnavn på én gang. Det kalder vi for kvalificeret navngivning. Ved at skrive tabelnavn et punktum og dernæst kolonnenavn, fortæller du SQL, at du vil have kolonnen i den specifikke tabel.

SELECT Tabel.Kolonne1, Tabel.Kolonne2, Tabel.*
FROM Tabel

Eksempel: Vis kolonnen Navn i tabellen Kunde:

SELECT Kunde.Navn
FROM Kunde

Omdøbning af tabel og kvalificeret navngivning

I forbindelse med kvalificeret navngivning bliver det meget relevant, hvad man har omdøbt tabellen til. Se dette klip fra SQL Server Management Studio. De røde streger antyder, at Kunde.Navn ikke kan findes.

Du får en fejl, hvis du kører forespørgslen:

Msg 4104, Level 16, State 1, Line 18
The multi-part identifier "Kunde.Navn" could not be bound.

Den korrekt måde er at bruge det navn, der er angivet efter AS ved tabellen.

SELECT Kundetabel.Navn
FROM Kunde AS Kundetabel

Resultatet er det samme som tidligere.

Du behøver ikke skrive AS

SQL tillader, at du udelader ordet AS. Så du kan faktisk gøre sådan her. Bemærk brugen af kvalificeret navngivning, hvor Kunde-tabellen er omdøbt til K.

SELECT K.Navn Kundenavn,
  K.Adresse1 Vej1,
  K.Adresse2 Vej2,
  K.Postnr Postnummer
FROM Kunde K

Prøv selv

  • Vis rækker fra Vare-tabellen med kolonnenavne, der kun er på ét bogstav.
  • Vis kolonnerne Navn, Email og Telefon fra Kundeemne-tabellen med kvalificeret navngivning, giv Kundeemner-tabellen navnet E.
  • Omdøb kolonnerne til hhv. Firmanavn, Emailadresse og Telefonnummer – brug AS.