Sql 按别名订购不起作用
更新问题:Sql 按别名订购不起作用,sql,postgresql,group-by,aggregate-functions,Sql,Postgresql,Group By,Aggregate Functions,更新问题: ERROR: column "Fruits" does not exist 运行Postgres 7.4是的,我们正在升级 为什么我不能按列别名排序?我也想要tof.TypeOfRuits,为什么 SELECT (CASE WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' WHEN tof."TypeOfFruits" = 'G' T
ERROR: column "Fruits" does not exist
运行Postgres 7.4是的,我们正在升级
为什么我不能按列别名排序?我也想要tof.TypeOfRuits,为什么
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
期望的结果是一行加上另一行,所以总共四行
x是总数
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
别名在order by之后分配,因此您不能在order by中使用它。改用这个:
(CASE
WHEN tof."TypeOfFruits" = 'A' THEN 'Apple'
WHEN tof."TypeOfFruits" = 'P' THEN 'Pear'
WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes'
ELSE 'Other' END)
你可以试试这样的。。。未经测试,但我见过类似的查询。 让我知道它是否有效
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
您可以使用ORDER BY 1按第一个字段(即水果)排序。这同样适用于GROUP BY
更新
对于order,在..中创建一个新列,而不是在order by中执行大小写。。说第二个立场:
(CASE
WHEN "Fruits" = 'Apple' THEN 1
WHEN "Fruits" = 'Pear' THEN 2
WHEN "Fruits" = 'Grapes' THEN 3
ELSE 4 ) as Order
然后按2的顺序排列。考虑如下事项:
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
原因可在以下文件中找到: [ORDER BY list]中的每个表达式可以是输出列选择列表项的名称或序号,也可以是由输入列值形成的任意表达式 我的重点 原因是SQL标准SQL-92的旧版本只允许按输出列名称或编号排序,而新版本允许按任意表达式排序,但这些表达式是由输入列值构成的
其他答案已经包含了各种适合您情况的解决方法。尝试使用反勾号而不是单引号/双引号来包装您的别名
MySQL也有同样的问题;backticks修复了问题。为什么水果拼错为Friut 10次?好的,我修复了拼写问题,你复制粘贴并更新了问题。这是一项不错的工作,我喜欢下面的@Joe的答案。如果我删除as FROUTS别名,则现在“分组依据”已关闭,因此我还有多行其他名称。还是我遗漏了什么?你为什么要删除它?你可以保留它,但不能在group by或order by子句中引用它。我在order by w/@Adrian group by 1中使用这个答案,但现在order by不是我想要的顺序。是按字母顺序排列的,有什么想法吗+1这确实对GROUP BY有所帮助,我使用@Joe Phillips ORDER BY,但ORDER BY现在按字母顺序排列,而不是我想要的顺序,因此我的示例中使用了数值+1尝试这一点,但现在它想要tof.typeofruits分组。我喜欢这个想法,但它仍然想要tof.typeofruits分组。错误:发件人中的子查询必须具有别名。不确定原因。外部查询应该只需要Fruits和NUM。您能详细说明一下吗?MySQL使用反勾号,PostgreSQL使用双引号,就像在SQL标准中一样。MySQL不符合标准。