Skapa databas
Lösningsförslag till några frågor.
Man kan skapa vyer genom
create view inkomst as
select b.reg_nr, sum(u.kostnad) as summa
from bil b, uthyrning u
where b.id = u.bil_id group by b.reg_nr;
och
create view utgift as
select b.reg_nr, sum(k.summa) as kostnad
from bil b, kostnad k
where b.id = k.bil_id
group by b.reg_nr
och då kan man hitta bilen som kostat minst med vyn utgift:
select * from utgift where kostnad =
(select min(kostnad) from utgift);
reg_nr | kostnad
--------+---------
FTE543 | 5380.00
Man kan hitta bilen som ger största vinsten genom att använda båda vyerna:
select reg_nr, summa - kostnad as vinst
from inkomst natural join utgift
where summa - kostnad =
(select max (summa - kostnad) from
inkomst natural join utgift);
reg_nr | vinst
--------+---------
FTE543 | 3145.00
Som koll på att man gjort rätt kan man använda båda vyerna så:
select reg_nr, summa as inkomst, kostnad, summa - kostnad as vinst
from inkomst natural join utgift;
reg_nr | inkomst | kostnad | vinst
--------+---------+---------+----------
FTE543 | 8525.00 | 5380.00 | 3145.00
USB220 | 1697.00 | 7684.00 | -5987.00
UUZ445 | 401.00 | 6591.00 | -6190.00
Och om man med "kostar minst" menar kostnad för kunden är det ju lätt
utan vyer:
select b.reg_nr, k.dygnspris, k.kilometerpris from
bil b, modell m, kategori k
where b.model_id = m.id and m.kategori_id = k.id
and k.dygnspris = (select min (dygnspris) from kategori);
reg_nr | dygnspris | kilometerpris
--------+-----------+---------------
FTE543 | 299.00 | 2.00
När man skapar vyer så lagras dessa i databasen och med många långa och krångliga vyer blir det mycket extra i databasen så, speciellt i applikationsprogram med mycket komplicerade frågeställningar brukar man istället använda "WITH" för att skapa konstruktioner som bara existerar under exekvering av SQL-satsen. Dessa, ofta svåröverblickbara, SQL-satser syns ju inte för användarna utan ligger gömda i programkoden så det gör inget att de är svåra att läsa och förstå för gemene man. Några av frågorna ovan blir då som följer.
Vilken bil har kostat företaget minst? :
with utgift as (select b.reg_nr, sum(k.summa) as kostnad
from bil b, kostnad k where b.id = k.bil_id
group by b.reg_nr)
select * from utgift where kostnad =
(select min(kostnad) from utgift);
reg_nr | kostnad
--------+---------
FTE543 | 5380.00
Vilken bil ger störst vinst? :
with inkomst as (select b.reg_nr, sum(u.kostnad) as summa
from bil b, uthyrning u
where b.id = u.bil_id group by b.reg_nr),
utgift as (select b.reg_nr, sum(k.summa) as kostnad
from bil b, kostnad k
where b.id = k.bil_id
group by b.reg_nr)
select reg_nr, summa - kostnad as vinst
from inkomst natural join utgift
where summa - kostnad =
(select max (summa - kostnad) from
inkomst natural join utgift);
reg_nr | vinst
--------+---------
FTE543 | 3145.00
Och
Frågan "Ta ut totalkostnad för en viss bränsletyp över en period" kan besvaras ganska enkelt genom att vara lite finurlig när man skapar en vy för bilar och deras bränsletyp:
create view bilbränsle as select b.id as bil_id, m.bränsle_typ
from bil b, modell m where b.model_id = m.id;
Jag har alltså döpt om bil.id till bil_id, samma namn som används i kostnadstabellen för att referera till bil.id. Då kan jag använda naturlig join för att kombinera mig fram till kostnaden för en viss bränsletyp. Alltså kan jag få svar på den mer explicita frågan "Vad var totalkostnaden för bensin under mars månad 2016?" med SQL-satsen:
select sum(summa) from kostnad natural join bilbränsle
where typ = 'Bränsle' and bränsle_typ = 'bensin'
and datum > '2016-02-29' and datum < '2016-04-01';
sum
---------
6425.00
Kan också besvaras med en "SELECT WITH"-sats:
with bilbränsle as (select b.id as bil_id, m.bränsle_typ
from bil b, modell m where b.model_id = m.id)
select sum(summa) from kostnad natural join bilbränsle
where typ = 'Bränsle' and bränsle_typ = 'bensin'
and datum > '2016-02-29' and datum < '2016-04-01';
sum
---------
6425.00
Vilken bil ger störst vinst? :
with inkomst as (select b.reg_nr, sum(u.kostnad) as summa
from bil b, uthyrning u
where b.id = u.bil_id group by b.reg_nr),
utgift as (select b.reg_nr, sum(k.summa) as kostnad
from bil b, kostnad k
where b.id = k.bil_id
group by b.reg_nr)
select reg_nr, summa - kostnad as vinst
from inkomst natural join utgift
where summa - kostnad =
(select max (summa - kostnad) from
inkomst natural join utgift);
reg_nr | vinst
--------+---------
FTE543 | 3145.00
Jag får samma resultat om jag gör såhär:
select reg_nr, summa as inkomst, kostnad, summa - kostnad as vinst
from inkomst
natural join utgift
where summa - kostnad = (select max( summa - kostnad) from inkomst natural join utgift);
Jag får samma resultat om jag gör såhär:
select reg_nr, summa as inkomst, kostnad, summa - kostnad as vinst
from inkomst
natural join utgift
where summa - kostnad = (select max( summa - kostnad) from inkomst natural join utgift);
Men då har du väl kvar vy-definitionerna? Släng dem med
DROP VIEW inkomst, utgift;
Avsikten med "WITH ... SELECT" är just att slippa lagra vyer.
Om du i postgresql ger kommandot "\d" ser du vilka tabeller, vyer, sekvenser, mm som lagrats i databasen.
Släng alla vyer och använd WITH istället. Jag säger inte att det är ett bättre sätt, bara att man kan göra så för att slippa vyhanteringen.
...
DÅ till frågan, TROR ni att det är möjligt för mig att lära mig skapa en sådan databas till 10 januari och hur avancerat är det egentligen?
Hur gick det? Blev de impade av din mestadels kopierade lösning ?
- Idag Rykte: Switch 2 släpps i höst – OLED-variant dröjer 2
- Idag Iphones marknadsandel faller i USA 38
- Igår Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk 76
- Igår Nu stiger hårddiskpriserna med uppemot 10 procent 21
- Igår Analytiker: Apple har överskattat intresset för Vision Pro 56
- ASUS P2B-D, första start på många år7
- Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk76
- Problem med ts3 server efter byte av router0
- Amazons Fallout-serie regisseras av Jonathan Nolan (Inte den Nolan, men hans brorsa)336
- Sony PlayStation Pulse Elite Headset1
- Cage/Bur till Fractal Design Define R5 fråga3
- Microsoft rullar ut Startmenyreklam till alla91
- Elbilar - Tråden för intresserade23188
- Iphones marknadsandel faller i USA38
- Ubiquiti Unifi2766
- Skänkes i386 Laptop Skänkes!
- Köpes Söker OLED 1440p/2160p 144hz-240hz
- Säljes Steamdeck 512GB LCD + 1TB OLED
- Köpes Söker ett z590 till 11th gen i7
- Säljes Acer 38" Predator X38S IPS Curved 175 Hz HDR600
- Säljes Ubiquiti Unifi U7 Pro trådlös accesspunkt
- Säljes Razer Core X Chroma + Sapphire Radeon RX 7800 XT 16GB Pulse
- Säljes Redmi Note 11 Graphite Gray 4GB RAM, 128GB ROM.
- Säljes Meta Quest 3 128GB
- Säljes Hårddiskar
- Rykte: Switch 2 släpps i höst – OLED-variant dröjer2
- NetonNet varnar om läckta kunduppgifter12
- Premiär på SweClockers! Månadens drop med gamingskärm hos Elgiganten58
- IT-bolag: Teknikstrul är största tidsboven idag30
- Därför blockerar Windows 11 24H2 Start‑menyhack35
- Iphones marknadsandel faller i USA38
- Konsumentverket granskar tio nätbutiker som lurat kunder18
- Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk76
- Nintendo-innehåll tas bort från Garrys Mod24
- Nu stiger hårddiskpriserna med uppemot 10 procent21