Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按别名订购不起作用_Sql_Postgresql_Group By_Aggregate Functions - Fatal编程技术网

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不符合标准。