ЗАКАЗАТЬ Псевдоним не работает - PullRequest
3 голосов
/ 23 июня 2011

ОБНОВЛЕНИЕ ВОПРОСА:

ERROR:  column "Fruits" does not exist

Запуск Postgres 7.4 (Да, мы обновляем)

Почему я не могу ЗАКАЗАТЬ ПО псевдониму столбца?также хочет, чтобы "TypeOfFruits" в ORDER BY, почему?

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",
    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, "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

Результаты на текущий момент

Fruits;daily;monthly;yearly;lifetime
"Apple";17;1174;3136;3136
"Pear";28;94;94;94
"Grapes";0;191;490;490
"Other";0;2;27;27
"Other";0;0;1;1
"Other";0;0;27;27
"Other";0;6;28;28
"Other";0;58;229;229
"Other";0;3;3;3
"Other";0;0;1;1

Желаемыми результатами будет одна строка с общим значением "Other",Таким образом, всего четыре строки (х будет общее)

Fruits;daily;monthly;yearly;lifetime
"Apple";17;1174;3136;3136
"Pear";28;94;94;94
"Grapes";0;191;490;490
"Other";x;x;x;x

Ответы [ 6 ]

7 голосов
/ 23 июня 2011

Вы можете использовать ORDER BY 1 для заказа по первому полю, которое "Фрукты". То же самое верно для GROUP BY

Обновление

Для заказа вместо case в order by создайте новый столбец в ... скажем .. второй позиции:

(CASE 
    WHEN "Fruits" = 'Apple' THEN 1 
    WHEN "Fruits" = 'Pear' THEN 2 
    WHEN "Fruits" = 'Grapes' THEN 3 
    ELSE 4 ) as Order

Тогда в тебе ORDER BY 2.

5 голосов
/ 25 июня 2011

Причину этого можно найти в документации :

Каждое выражение [в списке ORDER BY] может быть именем или порядковым номером столбца output (элемент списка SELECT) или произвольным выражением, сформированным из input -колоночные значения.

(мой акцент)

Причина этого в том, что старые версии стандарта SQL (SQL-92) допускали сортировку только по имени или номеру выходного столбца, тогда как более новые версии допускают сортировку по произвольным выражениям, но эти выражения формируются из значений входного столбца. 1015 *

Другие ответы уже содержат различные подходящие обходные пути для вашего случая.

2 голосов
/ 23 июня 2011

Рассмотрим что-то вроде этого:

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
1 голос
/ 23 июня 2011

Псевдоним назначается после заказа, поэтому вы не можете использовать его в заказе. Используйте это вместо:

(CASE
    WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' 
    WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' 
    WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' 
    ELSE 'Other' END)
0 голосов
/ 17 сентября 2014

Попробуйте использовать обратные кавычки (`) вместо одинарных / двойных кавычек для переноса имени псевдонима.

У меня возникла та же проблема с MySQL;обратные помехи решили проблему.

0 голосов
/ 23 июня 2011

Вы можете попробовать что-то вроде этого ... не проверено, но я видел похожие запросы.
Дайте мне знать, если это работает ...

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
...