Mise à jour de la question: exécutant postgres 7.4 (Ouais nous mettons à niveau) p> Pourquoi ne puis-je pas commander par l'alias de colonne? Veut TOF. "typeOffruits" dans l'ordre par aussi, pourquoi? p> résultat de maintenant p> désiré les résultats seraient une rangée avec le «autre» total, donc quatre rangées complètement
(x serait le total) p>
6 Réponses :
L'alias est attribué après la commande par afin que vous ne puissiez pas l'utiliser dans l'ordre par. Utilisez cela à la place:
(CASE WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' ELSE 'Other' END)
Si je supprimais l'alias "fruits", le groupe est désactivé maintenant, alors j'ai toujours plusieurs rangées d'autres. Ou je manque quelque chose?
Pourquoi le retirez-vous? Vous pouvez le garder mais vous ne pouvez pas le faire référence dans un groupe par ou à commander par clause
J'utilise cela dans la commande par W / @Adrian Group par 1 réponse, mais maintenant la commande par n'est pas dans l'ordre que je souhaite. C'est alphabétique, toutes les pensées? +1
Vous pouvez essayer quelque chose comme ça ... non testé, mais j'ai vu des requêtes similaires.
Faites-moi savoir si cela fonctionne ...
SELECT "Fruits", SUM(CASE WHEN r.order_date BETWEEN DATE_TRUNC('DAY', LOCALTIMESTAMP) AND DATE_TRUNC('DAY', LOCALTIMESTAMP) + INTERVAL '1 DAY' THEN 1 ELSE 0 END) AS daily, SUM(CASE WHEN r.order_date BETWEEN DATE_TRUNC('MONTH', LOCALTIMESTAMP) AND DATE_TRUNC('MONTH', LOCALTIMESTAMP) + INTERVAL '1 MONTH' THEN 1 ELSE 0 END) AS monthly, SUM(CASE WHEN r.order_date BETWEEN DATE_TRUNC('YEAR', LOCALTIMESTAMP) AND DATE_TRUNC('YEAR', LOCALTIMESTAMP) + INTERVAL '1 YEAR' THEN 1 ELSE 0 END) AS yearly, SUM(CASE WHEN r.order_date >= '01-01-2011 00:00:00' THEN 1 ELSE 0 END) AS lifetime FROM reports AS r ,(SELECT "ID", CASE WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' ELSE 'Other' END AS "Fruits" FROM "TypeOfFruits" ) AS "tof" WHERE r.id = tof."ID" GROUP BY "Fruits" ORDER BY CASE WHEN "Fruits" = 'Apple' THEN 1 WHEN "Fruits" = 'Pear' THEN 2 WHEN "Fruits" = 'Grapes' THEN 3 ELSE 4 END
Vous pouvez utiliser pour la commande, au lieu de faire le cas puis dans vous commander par 1 code> pour commander par le premier champ, qui est "Fruits". La même chose est valide pour
groupe par code>
code> dans le document
Commander par code>, créez une nouvelle colonne dans .. Dites .. Dites .. la deuxième position: p>
commander par 2 code>. p> p>
Cela a aidé avec le groupe par et j'utilise @joe Philllips Order par, mais la commande par est maintenant alphabétique et non dans l'ordre que je voulais, d'où les valeurs numériques dans mon exemple. +1
essayant ceci mais maintenant il veut le groupe par TOF. "typeOffruits"
Considérez quelque chose comme ceci:
SELECT * FROM (SELECT (CASE WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' ELSE 'Other' END) AS "Fruits", (CASE WHEN tof."TypeOfFruits" = 'A' THEN 1 WHEN tof."TypeOfFruits" = 'P' THEN 2 WHEN tof."TypeOfFruits" = 'G' THEN 3 ELSE 4 END) as NUM FROM ..... <rest of your query without group by and order by ..... ) GROUP BY Fruits ORDER BY NUM
J'aime cette idée, mais il veut toujours le TOF. "TypeOffruits" dans le groupe par. Erreur: la sous-requête de doit avoir un alias
Pas certain de pourquoi. La requête extérieure ne doit avoir besoin que de fruits et de num. Peux-tu élaborer?
La raison de celle-ci peut être trouvée dans le Documentation : p>
Chaque expression [dans la liste de la liste] peut être le nom ou l'ordinal numéro d'une colonne em> sortie em> (sélectionnez l'élément de liste) ou peut être une expression arbitraire formée à partir de entrée < / em> -columnes valeurs. P> blockQuote>
(mon emphase) p>
La raison en est que les anciennes versions de la norme SQL (SQL-92) uniquement autorisée par le tri de la colonne de sortie ou le numéro de la colonne de sortie, alors que les versions plus récentes permettent le tri par des expressions arbitraires, mais ces expressions sont formées à partir de valeurs de colonne d'entrée. < / p>
D'autres réponses contiennent déjà divers travaux de contournement appropriés pour votre cas. P>
Essayez d'utiliser des backtstics (`) au lieu de citations simples / doubles pour envelopper votre nom d'alias. P>
avait le même problème avec MySQL; Backticks corrigé le problème. P>
MySQL utilise des backticks, PostgreSQL utilise des guillemets doubles, comme dans la norme SQL. MySQL n'est pas conforme standard.
Pourquoi les fruits sont-ils mal orthographiés comme Friut 10 fois?
ok j'ai corrigé le problème d'orthographe (barrage que vous copiez et coller) et mis à jour la question un peu
Bon travail, j'aime la réponse de Joe ci-dessous.