[SQL] Bezettingsgraad berekenen in één query*

Pagina: 1
Acties:
  • 867 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moet een lijst van alle uitvoeringen maken.
Met titel, naam, beschrijving, aantal kaartjes dat verkocht is, het aantal stoelen dat beschikbaar was voor de uitvoering, en de bezettingsgraad(percentage stoelen dat bezet is)

ik heb al 2 aparte statements voor
1. de titel/naam/beschrijving/ aantal kaartjes verkocht
en
2. de titel/naam/beschrijving/ het aantal stoelen dat beschikbaar is

Hoe kan ik deze query's joinen en hier nog een bezettingsgraad bij maken?

Hieronder vind u de 2 query's die ik al heb

SQL:
10
11
12
13
14
Select v.Titel, v.Beschrijving, COUNT(*)AS AantalKaarten
FROM Voorstelling v
            INNER JOIN Uitvoering u ON v.Titel = U.Titel
            INNER JOIN Bezetting b ON (u.Titel = b.Titel) AND (u.Datumtijd = b.Datumtijd)
GROUP BY v.Titel, v.Beschrijving


SQL:
10
11
12
13
14
15
Select v.Titel, v.Beschrijving, Count(*)AS AantalStoelen
FROM Voorstelling v
                    INNER JOIN Uitvoering u ON v.Titel = U.Titel
                    INNER JOIN Zaal z ON u.Zaalnaam = z.Zaalnaam 
                    INNER JOIN Stoel s ON z.Zaalnaam = s.Zaalnaam
GROUP BY v.Titel, v.Beschrijving

[ Voor 34% gewijzigd door Verwijderd op 12-12-2007 17:30 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:03

Creepy

Tactical Espionage Splatterer

Wat heb je zelf al geprobeerd om een bezettingsgraad te krijgen? Wat lukte daar dan niet mee? Zie ook Programming Beleid en dan met name Programming Beleid - De Quickstart.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Hoe zien je tabellen er precies uit?

Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 08-09 13:19

MAX3400

XBL: OctagonQontrol

Ik snap sowieso niet waarom je query 1 en 2 wil combineren voor een bezettingsgraad. Neem aan dat kaartjes en stoelen een relatie van 1:1 hebben; of verkoop je, net als sommige vliegmaatschappijen, meer kaarten dan stoelen?

Bezettingsgraad is volgens mij gebaseerd op (aantal verkochte kaarten / totaal aantal stoelen)?

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MAX3400 schreef op woensdag 12 december 2007 @ 17:09:
Ik snap sowieso niet waarom je query 1 en 2 wil combineren voor een bezettingsgraad. Neem aan dat kaartjes en stoelen een relatie van 1:1 hebben; of verkoop je, net als sommige vliegmaatschappijen, meer kaarten dan stoelen?

Bezettingsgraad is volgens mij gebaseerd op (aantal verkochte kaarten / totaal aantal stoelen)?
Ja dat is inderdaad ook de bedoeling.
Sorry heb de opdracht verkeerd geinterpreteerd en hier neer gezet.
Dus ik moet eigenlijk de 2 tabellen: aantal verkochte kaarten / totaal aantal stoelen in een tabel zien te verwerken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

offtopic:
Als je code wil posten: Hoe post je code? / Hoe gebruik je de code tag? Plaatjes gebruiken heeft allerhande nadelen, zowel voor jezelf als voor ons, dus gewoon tekst gebruiken is voor iedereen beter. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 08-09 13:19

MAX3400

XBL: OctagonQontrol

Verwijderd schreef op woensdag 12 december 2007 @ 17:15:
[...]


Ja dat is inderdaad ook de bedoeling.
Sorry heb de opdracht verkeerd geinterpreteerd en hier neer gezet.
Dus ik moet eigenlijk de 2 tabellen: aantal verkochte kaarten / totaal aantal stoelen in een tabel zien te verwerken.
Euh...

Je hebt 1 db (ik lees: Voorstelling) met een x aantal tabellen en/of attributen. Maar gezien je stijl van querien gok ik even dat je via een inner join zeer snel het aantal verkochte kaarten voor een voorstelling kan delen door het aantal stoelen (dan ga je dus inderdaad beide queries combineren). Aan de andere kant kan je natuurlijk ook "versimpeld" eenmalig een tabel aanmaken waarin alleen zaal+hoeveelheid_stoelen staan en die combineren met query 1 voor de bezetting zonder constant te moeten kijken of de datum wel klopt.

Links of rechtsom kan je vrij veel doen...

[ Voor 3% gewijzigd door MAX3400 op 12-12-2007 17:20 ]

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb al geprobeert dit te verwerken door het UNION statement.
Hierbij kreeg ik deze uitvoer:

Afbeeldingslocatie: http://img136.imageshack.us/img136/4971/codetweakers2st9.png

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op woensdag 12 december 2007 @ 17:17:
offtopic:
Als je code wil posten: Hoe post je code? / Hoe gebruik je de code tag? Plaatjes gebruiken heeft allerhande nadelen, zowel voor jezelf als voor ons, dus gewoon tekst gebruiken is voor iedereen beter. ;)
Sorry mijn fout zal ze zo wel even editten!

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

Verwijderd schreef op woensdag 12 december 2007 @ 17:21:
Ik heb al geprobeert dit te verwerken door het UNION statement.
Hierbij kreeg ik deze uitvoer:

[afbeelding]
Errr... Heb je in die laatste kolom nu het aantal verkochte kaarten of het aantal beschikbare stoelen staan? Allebei kan natuurlijk niet. Misschien moet je echt even laten zien hoe je tabel (of tabellen) eruit zien?

[ Voor 7% gewijzigd door ATS op 12-12-2007 17:29 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 08-09 13:19

MAX3400

XBL: OctagonQontrol

ATS schreef op woensdag 12 december 2007 @ 17:28:
[...]

Errr... Heb je in die laatste kolom nu het aantal verkochte kaarten of het aantal beschikbare stoelen staan? Allebei kan natuurlijk niet.
Heb even geen sample_db bij de hand maar ik vermoed dat dit komt door een gebrek aan counts / inner join of het linken van verkeerde gegevens. :+

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ATS schreef op woensdag 12 december 2007 @ 17:28:
[...]

Errr... Heb je in die laatste kolom nu het aantal verkochte kaarten of het aantal beschikbare stoelen staan? Allebei kan natuurlijk niet. Misschien moet je echt even laten zien hoe je tabel (of tabellen) eruit zien?
Die 3 is het aantal verkochte kaarten
Die 20 en 21 zijn het aantal stoelen dat er in die zaal staan.
Ik zal zo de tabellen + de Query's Editten in dit bericht!

Hier de Statement die bij de bovenstaande tabel hoort.
SQL:
10
11
12
13
14
15
16
17
18
19
20
21
Select v.Titel, v.Beschrijving, COUNT(*)AS AantalVerkochtekaarten_AantalStoelen
FROM Voorstelling v
            INNER JOIN Uitvoering u ON v.Titel = U.Titel
            INNER JOIN Bezetting b ON (u.Titel = b.Titel) AND (u.Datumtijd = b.Datumtijd)
GROUP BY v.Titel, v.Beschrijving             
UNION
Select v.Titel, v.Beschrijving, COUNT(*)AS AantalVerkochtekaarten_AantalStoelen
                FROM Voorstelling v
                    INNER JOIN Uitvoering u ON v.Titel = U.Titel
                    INNER JOIN Zaal z ON u.Zaalnaam = z.Zaalnaam 
                    INNER JOIN Stoel s ON z.Zaalnaam = s.Zaalnaam
GROUP BY v.Titel, v.Beschrijving

[ Voor 39% gewijzigd door Verwijderd op 12-12-2007 17:35 ]


Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

OK, nog één keertje dan:
Laat ajb even zien hoe je tabellen er uit zien. Ik heb zelf niet zo heel veel zin om dat te gaan zitten reconstrueren uit je queries.
Het gebruiken van een UNION waarin je twee ongelijksoortige gegevens in één kolom gooit lijkt me niet productief. Waarom wil je dat in hemelsnaam? Hoe kan je weten, uit alleen het resultaat van die query, of die 3 het aantal verkochte kaarten of het aantal stoelen is? Niet, denk ik. Waarom wil je deze gegevens in één kolom samen voegen?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

Verwijderd

Terwijl ik je DB model niet ken denk ik eigenlijk aan zoiets:


SQL:
10
11
12
13
14
15
16
17
18
19
20
21
Select v.Titel, v.Beschrijving
, COUNT(s.stoelId)AS AantalStoelen
, SUM(DECODE(b.bezettingId, NULL, 0, 1)) AantalVerkochtekaarten /* iemand bezet maar 1 stoel, dus als je de stoelen telt die bezet zijn heb je ook het aantal verkochte kaarten, nietwaar? */
FROM Voorstelling v
            INNER JOIN Uitvoering u ON v.Titel = U.Titel
            INNER JOIN Zaal z ON u.Zaalnaam = z.Zaalnaam 
            INNER JOIN Stoel s ON z.Zaalnaam = s.Zaalnaam
-- left outer, want niet elke stoel zal bezet zijn...
           LEFT OUTER JOIN Bezetting b ON (u.Titel = b.Titel) 
                                 AND (u.Datumtijd = b.Datumtijd) 
                                 AND b.stoel = s.stoel
GROUP BY v.Titel, v.Beschrijving             



En zolang je je DB model niet toont zoals al zolang gevraagd, kunnen wij niets verder helpen...

Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 11-08 18:10

Goodielover

Only The Best is Good Enough.

Zoiets, gokkend naar je tabeldefinities...
SQL:
10
11
12
13
14
15
16
Select v.Titel, v.Beschrijving, COUNT(distinct b.id)/COUNT(distinct s.id) AS Bezettinggraad
FROM Voorstelling v
            INNER JOIN Uitvoering u ON v.Titel = U.Titel
            INNER JOIN Bezetting b ON (u.Titel = b.Titel) AND (u.Datumtijd = b.Datumtijd)
            INNER JOIN Zaal z ON u.Zaalnaam = z.Zaalnaam 
            INNER JOIN Stoel s ON z.Zaalnaam = s.Zaalnaam
GROUP BY v.Titel, v.Beschrijving
Pagina: 1