Ik heb een sql probleempje waar ik niet uit kom… Misschien heeft iemand een makkelijkere oplossing…
Even een korte uitleg... Ik moet uit een database gegevens halen over toertochten. Die tochten zijn verdeeld over 2 tabellen: algemene tochtgegevens (cust_file) en tochtdetails (file_costs). De verbindende sleutel tussen de 2 tabellen is file_id.
Ik heb de volgende query om tochten weer te geven op een website:
SELECT dbo.file_costs.aantal_sterren, dbo.file_costs.afstand, CONVERT(CHAR(11), dbo.cust_file.datum_tocht, 105) AS Expr1, dbo.cust_file.file_id,
dbo.cust_file.file_subject, dbo.cust_file.vertrek_afmeldplaats
FROM dbo.cust_file INNER JOIN
dbo.file_costs ON dbo.cust_file.file_id = dbo.file_costs.file_id INNER JOIN
dbo.basedata2 ON dbo.cust_file.soort_tocht = dbo.basedata2.bd_code
WHERE (dbo.cust_file.yn_cancelled = 0) AND (dbo.cust_file.yn_blocked = 0) AND (dbo.cust_file.soort_tocht <> 'SR') AND (dbo.file_costs.datumvan = '8/18/2012')
ORDER BY dbo.cust_file.datum_tocht, dbo.file_costs.aantal_sterren DESC, dbo.cust_file.file_id, dbo.file_costs.afstand
De bedoeling is dat de Tochten met de meeste sterren altijd bovenaan komt te staan. Dit komt terug in de ORDER BY. Dit werkt prima totdat een tocht meerdere afstanden heeft waarbij 1 afstand een ander aantal of helemaal geen sterren heeft. Wat er dan gebeurd is dat de afstand die afwijkt los komt te staan van de rest van de afstanden die wel een ster hebben. Om dit proberen op te lossen heb ik deze query geschreven:
SELECT DISTINCT
B.aantal_sterren, A.afstand, CONVERT(CHAR(11), dbo.cust_file.datum_tocht, 105) AS Expr1, dbo.cust_file.file_id, dbo.cust_file.file_subject,
dbo.cust_file.vertrek_afmeldplaats, dbo.cust_file.datum_tocht
FROM dbo.cust_file INNER JOIN
dbo.file_costs AS A ON dbo.cust_file.file_id = A.file_id INNER JOIN
dbo.file_costs AS B ON dbo.cust_file.file_id = B.file_id INNER JOIN
dbo.basedata2 ON dbo.cust_file.soort_tocht = dbo.basedata2.bd_code
WHERE (dbo.cust_file.yn_cancelled = 0) AND (dbo.cust_file.soort_tocht <> 'SR') AND (A.datumvan = '8/18/2012') AND (dbo.cust_file.yn_blocked = 0)
ORDER BY dbo.cust_file.datum_tocht, B.aantal_sterren DESC, dbo.cust_file.file_id, A.afstand
Dit werkt al beter, maar nog niet goed genoeg helaas. Alle afstanden van een tocht die verschillende sterren per afstand heeft komen nu netjes onder elkaar te staan. Maar nu komen in de resultaten dubbele rijen voor bij die tocht met verschillende sterren. per aantal sterren worden alle afstanden getoont. Om dit lange verhaal te verduidelijken heb ik even 2 screenshots bijgevoegd met de output.
Misschien dat iemand hier een oplossing voor heeft. Ik kan het natuurlijk wel er uit filteren op de site met een stukje code, maar als het in sql kan is het een stuk makkelijker.
Even een korte uitleg... Ik moet uit een database gegevens halen over toertochten. Die tochten zijn verdeeld over 2 tabellen: algemene tochtgegevens (cust_file) en tochtdetails (file_costs). De verbindende sleutel tussen de 2 tabellen is file_id.
Ik heb de volgende query om tochten weer te geven op een website:
SELECT dbo.file_costs.aantal_sterren, dbo.file_costs.afstand, CONVERT(CHAR(11), dbo.cust_file.datum_tocht, 105) AS Expr1, dbo.cust_file.file_id,
dbo.cust_file.file_subject, dbo.cust_file.vertrek_afmeldplaats
FROM dbo.cust_file INNER JOIN
dbo.file_costs ON dbo.cust_file.file_id = dbo.file_costs.file_id INNER JOIN
dbo.basedata2 ON dbo.cust_file.soort_tocht = dbo.basedata2.bd_code
WHERE (dbo.cust_file.yn_cancelled = 0) AND (dbo.cust_file.yn_blocked = 0) AND (dbo.cust_file.soort_tocht <> 'SR') AND (dbo.file_costs.datumvan = '8/18/2012')
ORDER BY dbo.cust_file.datum_tocht, dbo.file_costs.aantal_sterren DESC, dbo.cust_file.file_id, dbo.file_costs.afstand
De bedoeling is dat de Tochten met de meeste sterren altijd bovenaan komt te staan. Dit komt terug in de ORDER BY. Dit werkt prima totdat een tocht meerdere afstanden heeft waarbij 1 afstand een ander aantal of helemaal geen sterren heeft. Wat er dan gebeurd is dat de afstand die afwijkt los komt te staan van de rest van de afstanden die wel een ster hebben. Om dit proberen op te lossen heb ik deze query geschreven:
SELECT DISTINCT
B.aantal_sterren, A.afstand, CONVERT(CHAR(11), dbo.cust_file.datum_tocht, 105) AS Expr1, dbo.cust_file.file_id, dbo.cust_file.file_subject,
dbo.cust_file.vertrek_afmeldplaats, dbo.cust_file.datum_tocht
FROM dbo.cust_file INNER JOIN
dbo.file_costs AS A ON dbo.cust_file.file_id = A.file_id INNER JOIN
dbo.file_costs AS B ON dbo.cust_file.file_id = B.file_id INNER JOIN
dbo.basedata2 ON dbo.cust_file.soort_tocht = dbo.basedata2.bd_code
WHERE (dbo.cust_file.yn_cancelled = 0) AND (dbo.cust_file.soort_tocht <> 'SR') AND (A.datumvan = '8/18/2012') AND (dbo.cust_file.yn_blocked = 0)
ORDER BY dbo.cust_file.datum_tocht, B.aantal_sterren DESC, dbo.cust_file.file_id, A.afstand
Dit werkt al beter, maar nog niet goed genoeg helaas. Alle afstanden van een tocht die verschillende sterren per afstand heeft komen nu netjes onder elkaar te staan. Maar nu komen in de resultaten dubbele rijen voor bij die tocht met verschillende sterren. per aantal sterren worden alle afstanden getoont. Om dit lange verhaal te verduidelijken heb ik even 2 screenshots bijgevoegd met de output.
Misschien dat iemand hier een oplossing voor heeft. Ik kan het natuurlijk wel er uit filteren op de site met een stukje code, maar als het in sql kan is het een stuk makkelijker.