[MS SQL] Summary van data / Rapport maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 17-09 21:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
Ik moet een dagelijkse rapportage maken van data uit een enkele tabel.
Ik hoop dat ik zo een beetje duidelijk weergeef hoe het rapport moet worden:

NaamResult 1Result 2Result 3Result 4Result 5
X1Filter 1Filter 1 + 2Filter 1 + 3 + 4Result 1 - Result 3Result 2 / Result 4
X2Filter 1Filter 1 + 2Filter 1 + 3 + 4Result 1 - Result 3Result 2 / Result 4
X3Filter 1Filter 1 + 2Filter 1 + 3 + 4Result 1 - Result 3Result 2 / Result 4
X4Filter 1Filter 1 + 2Filter 1 + 3 + 4Result 1 - Result 3Result 2 / Result 4
X5Filter 1Filter 1 + 2Filter 1 + 3 + 4Result 1 - Result 3Result 2 / Result 4

En zo verder tot X25
Filter 1 = Aantal keer dat een string (X1, X2, X3, ...) voorkomt in kolom x
Filter 2 = De string mag niet voorkomen in kolom y
Filter 3 = De string moet juist wel voorkomen in kolom y
Filter 4 = De waarde van kolom z mag niet hoger zijn dan n
Result 4 = Result 1 minus Result 3
Result 5 = Result 2 gedeeld door Result 4

Alle resultaten zijn het aantal keren dat de gezamelijke filters de boolean TRUE geven.
Result 3 is dan bijvoorbeeld:
SQL:
1
SELECT COUNT(*) FROM 'mijntabel' WHERE (kolomX ='X1') AND (kolomY='X1') AND (kolomZ < 10)


Tot nu toe ben ik bezig om 25 x een view te maken voor Filter 1, welke ik dan kan (her)gebruiken voor Result 1 t/m 3, maar dan nog zit ik met een shitload aan redundante code.
Aangezien ik voor 25 namen 3 query's heb (Result 4 en 5 kan ik later in de programmacode berekenen zonder query), vraag ik me af of ik dit niet op een slimmere manier kan doen.

Kortom: Hoe haal ik op de beste manier mijn samenvatting uit de database?

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hoe ziet je tabel er uit?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 17-09 21:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
De relevante kolommen zijn deze:
idNaamGroepDuur
kan van alles zijn, maar altijd uniekeen groepsnaam of NULLeen gebruikersnaam, of weer een groepsnaamEen x-tal seconden


De tabel wordt dagelijks eerst geleegd en opnieuw gevuld met tussen de 1000 en 3000 rijen data van de vorige dag (uit een andere grote database), enkel en alleen om deze dagelijkse rapportage te maken.

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Het lijkt me verstandig die 25 namen eerst in een tabel ofzo te zetten.

Daarna kun je een aantal left joins doen met die tabel tegen een subquery met group by op naam. Ik zou in ieder geval in die richting gaan denken.

Acties:
  • 0 Henk 'm!

  • Hooiopdevork
  • Registratie: December 2008
  • Laatst online: 25-05-2023
Ik zou alle gegevens via een stored procedure ophalen.

Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 14-09 10:22
Ik zou het gewoon in het oorspronkelijke formaat laten en dan een rapporterings-programma te gebruiken om alles in het gewenste formaat te laten zien aan de gebruikers. Deze programma's zij hiervoor gemaakt.

Maar als je dat echt niet wilt dan kan je een hoop dingen doen met case statements. Maak een tabel met alle 25 namen zodat je deze kan gebruiken om op te joinen. En doe dan zoiets als dit:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT *
, Result1 - Result3 AS Result4
, Result2 / (Result1 - Result3) AS Result5
FROM(
SELECT N.Naam
, SUM(CASE WHEN N.Naam = T.KolomX THEN 1 ELSE 0 END) AS Result1
, SUM(CASE WHEN N.Naam = T.KolomX AND N.Naam != T.KolomY THEN 1 ELSE 0 END) AS Result2
, SUM(CASE WHEN N.Naam = T.KolomX AND N.Naam = T.KolomY AND T.KolomZ < "waarde n" AND THEN 1 ELSE 0 END) AS Result3
FROM Namen AS N
LEFT JOIN Tabel AS T ON N.Naam = T.Naam
GROUP BY N.Naam
) AS Temp
Hooiopdevork schreef op zaterdag 22 januari 2011 @ 07:01:
Ik zou alle gegevens via een stored procedure ophalen.
En wat voor een direct nut heeft dat? Als je geen idee hebt hoe je de waardes er goed uit krijgt dan heeft een stored procedure dus echt 0.0 aan toegevoegde waarde.

[ Voor 17% gewijzigd door DamadmOO op 22-01-2011 09:18 ]


Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 17-09 21:33

sjunnie

U mag ook Sjun zeggen

Topicstarter
Vanwege een paar zaken die tussendoor gedaan moesten worden, is het blijven liggen tot vandaag.

Echter wil ik nog even melden dat het met een kleine aanpassing (right join ipv left join) gelukt is met de query van DamadmOO. _/-\o_

If you can judge a wise man by the color of his skin then mister you're a better man than I

Pagina: 1