Permalänk
Medlem

Kanske missat något inlägg men varför vill ett hyrbilsföretag ha bara "en databas"? Vad ska dom använda den till om det inte finns något gränssnitt eller annat sätt att accessa datan?

Har bara snabbläst tråden men min initiala tanke när jag läst första inlägget och gjort min tolkning av förutsättningarna hos leverantör och beställare är att ett verktyg som Microsoft Access förmodligen vore mer lämpligt än att försöka implementera detta i SQL Server (vilket jag tolkade det som används här men kan ha fel).

Permalänk
Skrivet av furbel:

Det var därför jag föreslog sqlfiddle, det blir liksom enklare att hjälpa då, vi kan inte se din databas på din dator

Ah ok, ska se om jag fattar hur sqlfiddle funkar. Queryn alla table har jag ju sparat, så de kan jag posta i sqlfiddle, men datan som jag lagt in, vissa data har jag gjort via query men endel har jag petat in med GUI, för jag måste få ut dessa på något sätt?

Permalänk
Medlem
Skrivet av Tryckvagen:

Har skapat några rader nu, skulle jag kunna svara på någon av de enklare frågorna? Eftersom det frågas efter lite över 500 mätarställningar så antar jag att jag måste ha >500 uthyrningar också, kan jag göra alla dessa i ett svep?

För att kolla att det fungerar behöver du inte så mycket data i databasen. Det de menar med >500 mätarställningar är att systemet ska vara byggt för att klara av mer än 500 mätarställningar och m du använt min modell så är det inget problem eftersom varje uthyrning innehåller aktuell bils mätarställning då uthyrningen börjar och då den avslutas. Tabellen klarar (teoretiskt) 9223372036854775807 poster (om minnesutrymmet finns) och alltså lika många mätarställningar.

Permalänk
Avstängd
Skrivet av serafim:

Men här gäller SQL och då blir det relationsdatabas. Tydligen har @Tryckvagen valt PostgreSQL och då är det definitivt SQL som gäller.

Dessutom är det inte alla applikationsområden som lämpar sig för onormaliserade eller denormaliserade data. Datakonsistens ( i betydelsen att det inte ska finnas motsägelser i datamängden) är svår att upprätthålla i de systemen och i många fall i projekt jag varit med i, där man valt NoSQL-databas har man också valt att implementera kontrollmekanismer (som använder SQL och vanliga tabeller) för att ha en konsistenskontroll. Som ett resultat av de behoven har det kommit ännu nyare system, s.k. NewSQL-system som använder snabbheten hos NoSQL och kontrollsystem som oftast körs som egna processer och som går igenom och korrigerar data.

Precis som att all data inte heller lämpar sig för normaliserade varianter som du säkert också förstår.

Verkar som att ni inte kände till att det finns en write-ahead log.

Trådskaparen frågade om alla databaser är lika, och jag svarade att det finns olika. Jag skrev inte att tex. HBase är bästa förslaget får trådskaparens uppgift. Läs om, läs rätt.

Permalänk
Skrivet av furbel:

Som jag förstår det finns det switch till pg_dump att få ut ett sql script. Annars är det kanske inte så många rader ?

Men det var bara ett förslag, kör på som du vill.

http://sqlfiddle.com/#!15/0a725

Permalänk
Skrivet av furbel:

Du måste nog välja postgresql uppe till vänster. Sedan måste du ha hela scriptet med alla tabeller i rätt ordning dessutom, dvs de med fk efter det som de refererar till.

Märkte det, men nu ska det funka?

Permalänk
Skrivet av furbel:

Ja det funkar. Fattas bara INSERT .. med datan men sedan ska du kunna köra dina frågor till höger.

Kan man inte få ut dessa querys efter man kört dem? Har ju inte dom kvar, nu har jag inte så många men tänkte att det borde gå?

Permalänk
Medlem
Skrivet av Tryckvagen:

Kan man inte få ut dessa querys efter man kört dem? Har ju inte dom kvar, nu har jag inte så många men tänkte att det borde gå?

Skriv dem i en editor på egna datorn och kopiera till sqlfiddle för att köra dem.

Kollade lite på dina tabeller och hittade ett fel. Uthyrning.slutdatum ska inte deklareras 'not null' för då måste du in med slutdatum och tid direkt. I en riktig uthyrning väntar man tills kunden lämnar tillbaka bilen. Kanske stämmer varken start- eller slutdatum med bokningen (om det finns en) och slutdatum vet man ju inte förrän bilen kommer tillbaka.

Tittar vidare ikväll.

Permalänk

varför gnäller den?

Permalänk
Skrivet av furbel:

modell har bara fem kolumner men du försöker stoppa in sex värden. Antar att det sista ska bort ?

-- table kund

create table kund (
kund_id serial not null primary key, 1
personnummer character varying (13) not null unique, 2
förnamn character varying (40) not null, 3
efternamn character varying (40) not null, 4
adress character varying (50) not null, 5
postnummer integer not null, 6
ort character varying (50) not null 7
);

Permalänk
Medlem
Skrivet av Tryckvagen:

Den vet inte riktigt hur den ska hantera indata eftersom du har satt 'fnuttar' kring ett heltal. Bättre att vara väldigt explicit och räkna upp kolumnerna, OBS citat-tecken kring kolumner med svenska diakritiska tecken och inga fnuttar kring postnumret:

insert into kund (personnummer, "förnamn", efternamn, adress, postnummer, ort) values ('890329-7512', 'Jörgen', 'Rizz', 'Hagavägen', 11466, 'Kil')

Permalänk
Medlem
Skrivet av Vingman:

Precis som att all data inte heller lämpar sig för normaliserade varianter som du säkert också förstår.

Verkar som att ni inte kände till att det finns en write-ahead log.

Trådskaparen frågade om alla databaser är lika, och jag svarade att det finns olika. Jag skrev inte att tex. HBase är bästa förslaget får trådskaparens uppgift. Läs om, läs rätt.

Tänker nog inte att detta är rätta platsen för att gå i polemik kring petitesser. Jag kommenterade ditt inlägg utan att ha för avsikt att du ska känna dig kränkt.
1.
Jo, jag vet att det finns olika lösningar för olika behov av datalagring och har använt de flesta. Just nu programmerar jag sökalgoritmer för sökning i semistrukturerad och helt ostrukturerad data.

2.
Jo, jag vet att det finns en write-ahead log och att den endast hanterar A och D i ACID-problematiken och att det, även om det räcker en bit, inte täcker in konsistens-problematiken, vilket min kommentar handlade om.

3.
Nej, han frågade om det spelade någon roll vilken databashanterare han valde och om de "följer TYP samma språk".

Så, ledsen om du kände dig kränkt på något sätt av min kommentar. Ska inte upprepas, inte av mig i alla fall.

Korrigerade dålig svenska
Permalänk
Skrivet av serafim:

Den vet inte riktigt hur den ska hantera indata eftersom du har satt 'fnuttar' kring ett heltal. Bättre att vara väldigt explicit och räkna upp kolumnerna, OBS citat-tecken kring kolumner med svenska diakritiska tecken och inga fnuttar kring postnumret:

insert into kund (personnummer, "förnamn", efternamn, adress, postnummer, ort) values ('890329-7512', 'Jörgen', 'Rizz', 'Hagavägen', 11466, 'Kil')

Fick krångla innan jag fick till det, men fick göra såhär:

insert into kund (kund_id, personnummer, förnamn, efternamn, adress, postnummer, ort) values (default, 9011228733, 'Jörgen', 'Rynkström', 'Holgatan', 78449, 'stockholm');

Permalänk
Medlem

En liten fundering i sammanhanget med postnummer... nu är detta ju bara en lek-databas och syftet inte är att skapa ett produktionssystem, men jag skulle inte gjort postnummer som ett integer-fält då detta ger problem med kunder från andra länder än Sverige samt( om man nu anpassar DB:n till att hantera andra länder ) att lands-kods-fält hade varit bra att ha.

Skickades från m.sweclockers.com

Permalänk
Skrivet av Napoleongl:

En liten fundering i sammanhanget med postnummer... nu är detta ju bara en lek-databas och syftet inte är att skapa ett produktionssystem, men jag skulle inte gjort postnummer som ett integer-fält då detta ger problem med kunder från andra länder än Sverige samt( om man nu anpassar DB:n till att hantera andra länder ) att lands-kods-fält hade varit bra att ha.

Skickades från m.sweclockers.com

Absolut det stämmer, men nu är det som sagt bara en lite testdatabas. Men annars kanske man skulle ha använt CHARACTER VARYING(n).

Permalänk

Databasen ser ut som följande:

https://www.dropbox.com/s/1nb2bhn3tovucav/cr.sql?dl=0

Den som vill kan ladda ner den och komma med förslag och hjälpa mig med querys till frågeställningarna.

Verkar inte man kan dela hela databasen i SQLfiddle och utföra querys där?

Permalänk
Medlem
Skrivet av Tryckvagen:

Databasen ser ut som följande:

https://www.dropbox.com/s/1nb2bhn3tovucav/cr.sql?dl=0

Den som vill kan ladda ner den och komma med förslag och hjälpa mig med querys till frågeställningarna.

Verkar inte man kan dela hela databasen i SQLfiddle och utföra querys där?

Jag återanvände de data som @Tryckvagen hade lagt in.
Dessutom korrigerade jag några småsaker och lade till egenskaper i kostnadstabellen.
Jag automatgenererade via ett python-script 99 poster i kostnadstabellen,
lade till kategorier och knyckte kostnader från ett biluthyrningsföretags så de är marknadsmässiga.
Kostnader för uthyrningar beräknade jag med reglerna på samma företag. Alla uthyrningskostnader beräknades utifrån att 100 km per betalat dygn ingår så om
d är antalet påbörjade dagar,
dp är dagspriset,
k är antalet km (mätarställning__slut - mätarställning_start) och slutligen
kp är km-priset för den kategori bilen tillhör blir hyran
d x dp
om kunden kört högst 100 km per påbörjat dygn och
d x dp + kp x (k - d x 100)
om kunden kört mer än 100 km i snitt per påbörjat dygn.

Eftersom kostnader för företaget är autogenererade finns troligen ingen rimlig relation mellan kostnader och inkomster och mest inkomstbringande bil kan mycket väl vara en förlustaffär.
Om ni importerar databas-skriptet till någon annan databashanterare så gå igenom det och ändra autoinkrement-deklarationerna till det som gäller aktuell db-hanterare. I stort sett måste nog alla "bigserial NOT NULL PRIMARY KEY" ändras. Närmaste motsvarighet i MySQL torde vara "BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE".
De som är vana MySQL-användare kan nog hitta en metod i MySQL Workbench, det fungerade för mig men är så länge sen att jag glömt. Posta gärna anvisningar, den som vet hur man gör. PostgreSQL låg åtminstone förr närmare SQL-standarden än MySQL men det kan ha ändrats.

Ska försöka hinna skriva queries under kvällen och förmiddagen i morgon. Det här är kul men jag har en deadline att passa så hjälp från andra med att formulera frågorna i SQL uppskattas.

Rättat felstavningar (jag är snabbare än mitt tangentbord)
Permalänk
Medlem
Skrivet av Tryckvagen:

Verkar inte man kan dela hela databasen i SQLfiddle och utföra querys där?

Nej, sqlfiddle klagar över "> 8000" tecken

Permalänk
Medlem

Just det, jag lade till telefonnummer också:

select * from telefon where kund_id < 3;

ger

id | typ | telnr | landskod | kund_id ----+--------+------------+----------+--------- 1 | mobil | 0701234567 | +46 | 1 2 | hem | 0311234567 | +46 | 1 3 | mobil | 0702234568 | +46 | 2 4 | arbete | 0193234569 | +46 | 2 (4 rows)

Permalänk

Börjar med en lite enklare av frågeställningen.

vilken bil har gått längst?:

http://sqlfiddle.com/#!15/446413/1/0

select reg_nr,mätarställning, märke, bränsle_typ from bil left outer join modell on bil.id = modell.id order by mätarställning desc limit 1; reg_nr mätarställning märke bränsle_typ FTE543 50103 volvo diesel

Permalänk
Medlem

Samma utan outer join

select b.reg_nr, b.mätarställning, m.märke, m.bränsle_typ from bil b, modell m where b.mätarställning = (select max(mätarställning) from bil) and b.model_id = m.id; reg_nr | mätarställning | märke | bränsle_typ --------+----------------+-------+------------- FTE543 | 50103 | volvo | diesel (1 row)

Permalänk

Vet dock inte riktigt hur jag ska tänka på t.ex:
Ta ut totalkostnad per mil, både totalt och per bil

Permalänk
Medlem
Skrivet av Tryckvagen:

Vet dock inte riktigt hur jag ska tänka på t.ex:
Ta ut totalkostnad per mil, både totalt och per bil

Lite krångligt i SQL att ta ut avrundade värden, normalt tar man ut värdena som de är och låter applikationsprogrammet sköta avrundningen.
Om man menar bara kostnad per mil är det inte svårt. Får fundera lite längre om man menar kostnad för kunden (= inkomst för företaget).
Företagets totalkostnad utan avrundning (per mil är ju 10 x per km)

select 10 * sum(k.summa)/sum(b.mätarställning) as milkostnad from kostnad k, bil b; milkostnad ------------------------ 0.3327517228008953277 (1 row)

Med avrundning

select round( CAST(10 * sum(k.summa)/sum(b.mätarställning) as numeric), 2) as milkostnad from kostnad k, bil b; milkostnad ------------ 0.33 (1 row)

Utslaget per bil:

select b.reg_nr, sum(k.summa) * 10 / b.mätarställning as milkostnad from bil b, kostnad k where b.id = k.bil_id group by b.id; reg_nr | milkostnad --------+------------------------ UUZ445 | 12.6385426653883030 FTA543 | 15.3020000000000000 FTE543 | 1.07378799672674290961 UUX445 | 49.6077170418006431 USB220 | 10.9928469241773963 USE220 | 9.5978789217852408 (6 rows)

Med avrundning:

select b.reg_nr, round( CAST(sum(k.summa) * 10 / b.mätarställning as numeric), 2) as milkostnad from bil b, kostnad k where b.id = k.bil_id group by b.id; reg_nr | milkostnad --------+------------ UUZ445 | 12.64 FTA543 | 15.30 FTE543 | 1.07 UUX445 | 49.61 USB220 | 10.99 USE220 | 9.60 (6 rows)

Funderade lite och här kommer kostnad för kunden utan avrundning (brydde mig inte om att döpa om utmatningskolumnen)

select sum(10 * (kostnad / (mätarställning_slut - mätarställning_start))) from uthyrning; sum ---------------------- 259.8644315537479060 (1 row)

Och per bil

select b.reg_nr, sum(10 * (u.kostnad / (u.mätarställning_slut - u.mätarställning_start))) from uthyrning u, bil b where u.bil_id = b.id group by b.id; reg_nr | sum --------+---------------------- USB220 | 84.8500000000000000 FTE543 | 135.3114612567182030 UUZ445 | 39.7029702970297030 (3 rows)

Med avrundning blir det lite grisigare men det är inte viktigt här. Man kan ju se längre upp hur det går till.

Man kan ju göra allt i SQL eftersom användaren av gränssnittet inte ser SQL-satserna. Många av de jag så gott som dagligen skriver är så grisiga att de inte går att läsa utan att man bryter ner dem i en serie vydeklarationer med en avslutande enkel SQL-sats.

Permalänk
Medlem
Skrivet av serafim:

Om ni importerar databas-skriptet till någon annan databashanterare så gå igenom det och ändra autoinkrement-deklarationerna till det som gäller aktuell db-hanterare. I stort sett måste nog alla "bigserial NOT NULL PRIMARY KEY" ändras. Närmaste motsvarighet i MySQL torde vara "BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE".
De som är vana MySQL-användare kan nog hitta en metod i MySQL Workbench, det fungerade för mig men är så länge sen att jag glömt. Posta gärna anvisningar, den som vet hur man gör. PostgreSQL låg åtminstone förr närmare SQL-standarden än MySQL men det kan ha ändrats.

På w3schools.com finns en sida SQL AUTO INCREMENT a field med instruktioner för hur man gör i några databashanterare, inklusive MySQL.

Permalänk

Vet inte riktigt hur jag ska göra för att få ett bättre svar?

"Vilken bil kostar minst?"

select modell.id, bil.reg_nr, modell.märke, (modell.bränsleåtgång / 10) * 13.50 as krmil, dygnspris, kilometerpris from bil join modell on bil.modell_id = modell.id join kategori on modell.id = kategori.id order by krmil desc;

ger

"id","reg_nr","märke","krmil","dygnspris","kilometerpris" 4,"FTA543","volvo", 10.395, 699, 2.6 2,"USB220","volvo", 7.83, 399, 2.1 3,"UUZ445","volvo", 5.535, 499, 2.4 1,"FTE543","volvo", 5.4, 299, 2

Permalänk
Medlem
Skrivet av kyuw:

Vad exakt utvecklades av Lennart Lindström ? Ser ut att vara ganska standard entity modelling

"Entity–relationship modeling was developed for database design by Peter Chen and published in a 1976 paper"

https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_mod...

Missade det här inlägget. Sant att ER-modellering utvecklades av Peter Chen. Det jag menade var IRM-metoden som innehåller mer än bara ER-modellering. Det framgick inte av mitt inlägg och dessutom har du rätt i att det lilla som jag visade upp är en liten del av det Peter Chen introducerade. Egentligen kom ingenting med av det som Lennart utvecklat på IRM-konsult.
Däremot tror jag att Lennart ersatte romberna för sambandsklasser i Chens notation med linjer med en gaffel i "många"-änden. Det blir också snabbt plottrigt med romberna i stora modeller, linjer blir överskådligare.
Lennart (med flera) lade till verktyg som gjorde IRM till en verktygslåda för hela utvecklingen från idé till färdigt system.

Men: Äras den som äras bör. Peter Chen utvecklade ER-modellering.

Permalänk
Medlem

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

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

Permalänk
Medlem

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

Permalänk
Skrivet av serafim:

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

Denna funkar också?

select typ, sum(summa) as summa from kostnad where datum between '2016-01-20' and '2016-02-01' group by typ;

Permalänk
Medlem
Skrivet av Tryckvagen:

Denna funkar också?

select typ, sum(summa) as summa from kostnad where datum between '2016-01-20' and '2016-02-01' group by typ;

Ja men då kan du inte få ut mer info än att det rör sig om bränsle eller inte bränsle. Bensin eller diesel hittar man i modellen.
Med just dessa datum blir det av en slump bara bränsle och inga andra utgifter.