WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL fråga (https://www.wn.se/forum/showthread.php?t=1060169)

SweLogan 2013-12-15 00:20

SQL fråga
 
Ska göra en undersökning i en webshop och det jag vill kolla om någon har gjort en beställning där beställningen inte har slutförts.

ID - Betald - Personnummer - Summa
1 - 1 - xxxxxx-xxxx - 100
2 - 0 - yyxxxx-xxxx - 200
3 - 0 - yyxxxx-xxxx - 200
4 - 1 - yyxxxx-xxxx - 200
5 - 0 - ggxxxx-xxxx - 300 - Dessa är av intresse, men ska bara räkna en av dem
6 - 0 - ggxxxx-xxxx - 300 - Dessa är av intresse, men ska bara räkna en av dem

Då ska sqlen retunera totalsumman på 300 alltså de två sista raderna då nån har gjort en beställning men inte betalningen har gått igenom. Men har han försökt med t.ex ett annat betalsätt så ska den inte räknas med om den vart satt som betald.

Sen ska toleransen vara på 2 dagar, ifall personen har gjort flera köp under året.

Nerix 2013-12-15 02:38

Ett tips är att normalisera databasen. De där ser jätteskumt ut.

SweLogan 2013-12-15 03:08

Vad menar du med normalisera?

Conny Westh 2013-12-15 03:49

Det finns en bra grund som förklarar normalisering här: http://www.databasteknik.se/webbkursen/normalisering/

Läs detta först innan du ställer frågor om relationsdatabaser och SQL.

Såg att i länken finns ett fel hur man tolkat 3NF. 3NF krävs att man har en unik identifiering av varje enskild rad i tabellen så felet som beskrivs kan aldrig uppkomma. BCNF bygger på detta missförstånd av Codds ursprungliga definition av 3NF. Det finns även en 4NF men i normalfallet räcker det gott att använda 3NF.

Ska kolla om jag hittar en bättre länk...

Conny Westh 2013-12-15 04:05

Här visar jag ett försök att ha normaliserat din databas till 3NF för att visa vilka konsekvenser det får och hur det kan se ut i just ditt fall.

Databasen behöver normaliseras så man lägger upp separata tabeller för:

Tabell: Kund
- Kundnr (PK)
- Personnr (ev. FK)
- Namn


Tabell: KundOrder
- Ordernr (PK)
- Datum
- Kundnr (FK->Kund.Kundnr)

Tabell: KundOrderRad
- Ordernr (PK->KundOrder.Ordernr)
- RadNr (PK)
- ArtikelID (FK->Artikel.ArtikelID)
- FaktisktPris
- Antal
- RadRabattBelopp


Tabell: Artikel
- ArtikelID (PK)
- Benämning
- Pris
- Moms

Tabell: Betalning
- BetalningsID (PK)
- Datum
- OrderNr (FK->KundOrder.Ordernr)
- Belopp
- Betalsätt (FK->Betalsätt.BetalsättID)

Tabell: Betalsätt
- BetalsättID (PK)
- BetalsättNamn


Du behöver normalt bryta ut betalning från kundorder-tabellen eftersom kunder ofta betalar fel belopp och då kommer det att finnas flera olika betalningar med olika datum som du behöver hålla koll på.

PK => Primärnyckel (Primary Key på engelska, kan vara en eller flera kolumner i databasen)
FK => Främmande nyckel (Forreign Key på engelska) Pekar på en primärnyckel i en annan tabell.

En FK kan även vara en PK samtidigt, då kallas det för att relationen ät Identifying....

tartareandesire 2013-12-15 23:06

Connys förslag är väl antagligen irrelevant för din del då jag förmodar att du inte har möjlighet att bygga om databasen? Jag föreslår att du bara plockar ut alla obetalda rader ur databasen och sen hanterar dessa i valfritt scriptspråk.

Kod:

SELECT * FROM tbl WHERE Betald = 0 AND Summa = 300
Det är väl bara de som var intressanta om jag förstod dig rätt?

pelmered 2013-12-16 09:24

För att plocka ut alla obetalda och filtrera bort alla dubbletter kan du köra följande query:
Kod:

SELECT DISTINCT * FROM tbl WHERE Betald = 0
För att uppfylla alla dina krav till 100% så måste man dock skriva en ganska avancerad query som har subqueries. Det verkar ju dock saknas en del information i ditt exempel, t.ex. datum.

SweLogan 2013-12-16 13:08

Citat:

Ursprungligen postat av ITisGood.se (Inlägg 20483054)
För att plocka ut alla obetalda och filtrera bort alla dubbletter kan du köra följande query:
Kod:

SELECT DISTINCT * FROM tbl WHERE Betald = 0
För att uppfylla alla dina krav till 100% så måste man dock skriva en ganska avancerad query som har subqueries. Det verkar ju dock saknas en del information i ditt exempel, t.ex. datum.

Jo datum finns ;) Glömde att skriva med det i exemplet.


Alla tider är GMT +2. Klockan är nu 11:37.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson