7
votes

La commande par alias ne fonctionne pas

Mise à jour de la question: xxx

exécutant postgres 7.4 (Ouais nous mettons à niveau)

Pourquoi ne puis-je pas commander par l'alias de colonne? Veut TOF. "typeOffruits" dans l'ordre par aussi, pourquoi? xxx

résultat de maintenant xxx

désiré les résultats seraient une rangée avec le «autre» total, donc quatre rangées complètement (x serait le total) xxx


3 commentaires

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.


6 Réponses :


2
votes

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)


3 commentaires

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



0
votes

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


0 commentaires

11
votes

Vous pouvez utiliser commander par 1 pour commander par le premier champ, qui est "Fruits". La même chose est valide pour groupe par

update

pour la commande, au lieu de faire le cas dans le document Commander par , créez une nouvelle colonne dans .. Dites .. Dites .. la deuxième position: xxx

puis dans vous commander par 2 .


2 commentaires

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"



2
votes

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


2 commentaires

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?



6
votes

La raison de celle-ci peut être trouvée dans le Documentation :

Chaque expression [dans la liste de la liste] peut être le nom ou l'ordinal numéro d'une colonne sortie (sélectionnez l'élément de liste) ou peut être une expression arbitraire formée à partir de entrée < / em> -columnes valeurs.

(mon emphase)

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.


0 commentaires

-1
votes

Essayez d'utiliser des backtstics (`) au lieu de citations simples / doubles pour envelopper votre nom d'alias.

avait le même problème avec MySQL; Backticks corrigé le problème.


1 commentaires

MySQL utilise des backticks, PostgreSQL utilise des guillemets doubles, comme dans la norme SQL. MySQL n'est pas conforme standard.