sélectionner les meilleures valeurs de l'union de deux tables

essayer de sélectionner les 5 meilleurs pays sur un syndicat, mais il ne semble pas fonctionner. c'est mon code:

SELECT TOP 5 country_number, country_name FROM ( SELECT country_number, country_name, COUNT(DISTINCT number) FROM ( SELECT tc.country_number, tc.country_name, tdc.number, count(*) as tot_cnt FROM tblCountry tc INNER JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number INNER JOIN tblWorks_for AS tw ON tw.club_number = tdc.number INNER JOIN tblDiver AS td ON td.diver_number = tw.diver_number WHERE tw.end_working_date IS NULL GROUP BY tc.country_number, tc.country_name, tdc.number HAVING count(*) > 1 ) as der GROUP BY country_number, country_name UNION SELECT country_number, country_name, COUNT(DISTINCT number) FROM ( SELECT tc.country_number, tc.country_name, tdc.number, count(*) as diveCount FROM tblCountry tc INNER JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number INNER JOIN tblDiving AS tdv ON tdv.diving_club = tdc.number WHERE tdv.date_of_diving >= DATEADD(year,-1, GETDATE()) GROUP BY tc.country_number, tc.country_name, tdc.number HAVING count(*) > 6 ) as der2 GROUP BY country_number, country_name )as combinedTable 

il n'acceptera pas "combinedTable" ou tout autre nom / command que je place après "as".

Sur votre première requête de l'union, vous avez besoin d'un alias pour le count agrégé. Toutes les colonnes doivent avoir un nom dans la première requête d'une union. Puisque vous utilisez une fonction pour calculer une valeur, vous devez utiliser un alias pour lui assigner un nom:

 SELECT country_number, country_name, COUNT(DISTINCT number) as countNumber 

N'aimes-tu pas que la structure de SQL se prête à suggérer que le problème avec ton code est à l'autre extrémité du file de code? 🙂

Vous pouvez essayer de spécifier un nom de colonne pour

 COUNT(DISTINCT number) 

ou même en supprimant cette colonne des deux sélections.

Vous pourriez être en mesure de simplifier votre requête, non testé:

 SELECT TOP 5 country_number, country_name FROM ( SELECT tc.country_number, tc.country_name, tdc.number, count(*) as tot_cnt FROM tblCountry tc JOIN tblDivingClub AS tdc ON tdc.country = tc.country_number JOIN tblWorks_for AS tw ON tw.club_number = tdc.number JOIN tblDiver AS td ON td.diver_number = tw.diver_number WHERE tw.end_working_date IS NULL OR tdv.date_of_diving >= DATEADD(year,-1, GETDATE()) GROUP BY tc.country_number, tc.country_name, tdc.number HAVING count(*) > CASE WHEN tw.end_working_date IS NULL THEN 1 ELSE 6 END ) as T