2010-07-21 4 views
1

J'essaie de trouver la somme de tous les champs listés, mais étant donné qu'il s'agit de sous requêtes ... j'ai besoin d'utiliser des alias. Si j'utilise les alias listés, j'obtiens des erreurs inconnues de colonne/champ ... et si j'essaye une somme (points) en utilisant un groupe par, j'obtiens une utilisation invalide de l'erreur de clause de groupe.SQL - SOMME des champs par alias

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS '100m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS '200m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS '400m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS '800m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS '1500m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS '3000m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS 'Javelin' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS 'Shot Put' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS 'Discus' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS 'High Jump' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS 'Long Jump' 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

Merci pour vos idées. Renvoyez cette requête sous la forme d'une table dérivée, puis sélectionnez les sommes.

+0

Cela semble être une copie de http://stackoverflow.com/questions/3289941/unknown-column-in-where-its-defined-right-there. –

Répondre

1

+0

J'ai donc besoin d'une table temporaire? Des alternatives? –

+0

@ pc-nerd - Plus d'informations sur votre schéma permettraient d'affiner la réponse. Avez-vous des tables que vous pourriez croiser dans une jointure pour éliminer le besoin de toutes les sous-requêtes? Dans quelle mesure êtes-vous dépendant de ces colonnes? Pourriez-vous vous débrouiller avec le groupement de sortie? Une autre option consiste à mettre cela dans une vue, puis interroger à partir de celui-ci. –

+0

Ok ... Je peux probablement coller les informations pertinentes si vous préférez cela. La raison pour laquelle columsn est sous-requêtes, est que chaque colonne est un sport, mais l'événement de ce sport va changer en fonction du groupe d'âge/sexe de la requête (cela fonctionne dans une boucle php sur tous les groupes d'âge/sexes). les événements sont spécifiques à ce sport/genre/âge. Les colonnes sont absolument nécessaires ... Comment une jointure de référence croisée les éliminerait-elle? –

3

Donnez ce un coup:

SELECT 
    pr.competitorID AS compID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) AS name 
    , SUM(CASE 
     WHEN pr.heatEventID=1 
     THEN pr.points 
     ELSE 0 END) AS "100m" 
    , SUM(CASE 
     WHEN pr.heatEventID=25 
     THEN pr.points 
     ELSE 0 END) AS "200m" 
    ... 
    , SUM(CASE 
     WHEN pr.heatEventID IN (1,25,...) 
     THEN pr.points 
     ELSE 0 END) AS total 
FROM 
    participation_reports pr 
    JOIN event_data 
    ON event_data.eventID = pr.heatEventID 
WHERE 
    ... 
GROUP BY 
    pr.competitorID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) 
+0

+1 C'est aussi une très bonne approche. –

+0

Cette solution ne semble pas fonctionner, elle est basée sur le fait que je ne peux pas utiliser l'alias de la colonne dans la clause WHERE (je pense qu'elle l'analyse, de sorte que les alias sont les dernières choses à appliquer après que les colonnes sont recherchées, etc ...) Je pense (je me trompe probablement), que vous ne pouvez pas utiliser d'alias de colonnes ailleurs que de les définir dans la clause SELECT. EDIT: Spécifiquement - J'ai besoin des sommets sommets (points) ..., et je ne veux pas de lignes où SUM (points) est 0 (indiquant aucune participation). –

+0

Vous n'avez pas besoin d'utiliser un alias de colonne dans la clause WHERE. – bernie

0

Je ne suis pas tout à fait clair sur ce que vous avez besoin, mais si vous voulez la somme de toutes ces colonnes crénelage, pourrait ne pas être votre problème qu'ils ne sont pas la colonne légale des noms? Que diriez-vous ...

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS c_100m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS c_200m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS c_400m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS c_800m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS c_1500m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS c_3000m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS Javelin 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS Shot_Put 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS Discus 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS High_Jump 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS Long_Jump, 
c_100m + c_200m + c_400m + c_800m + c_1500m + c_3000m + Javelin + Shot_Put + High_Jump + Long_Jump 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

ou ai-je mal compris le problème?

+0

Bonjour, J'ai essayé votre solution, mais je reçois toujours une colonne c_100m non définie. Je suis assez certain de ma lecture que je ne peux pas utiliser un alias de champ dans ce contexte. *** Je pense que ma solution actuelle est de faire une boucle en utilisant php et d'interroger chaque champ, et de prendre la somme basée sur une autre requête, deux fois plus inefficace - mais je ne passe pas plus de temps à corriger cela que d'obtenir table finale qui est urgent .... thnx si –

+0

Righto. Désolé je ne pourrais pas être plus d'aide. –