Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 在GROUPBY中使用SELECT的Case语句的columnName_Sql_Postgresql - Fatal编程技术网

Sql 在GROUPBY中使用SELECT的Case语句的columnName

Sql 在GROUPBY中使用SELECT的Case语句的columnName,sql,postgresql,Sql,Postgresql,这是我的疑问: SELECT d.DeptName, CASE WHEN e.WorkCity is NULL THEN 'Mobile' ELSE 'Stationary' END AS EmpType, AVG(e.MonthlyPayScale) AS AvgMnthPay FROM Department d, Employee e WHER

这是我的疑问:

SELECT d.DeptName, CASE WHEN e.WorkCity is NULL THEN 'Mobile'
                                           ELSE 'Stationary'
                        END AS EmpType,
        AVG(e.MonthlyPayScale) AS AvgMnthPay
FROM Department d, Employee e
WHERE d.DeptId = e.DeptId
GROUP BY d.DeptName, EmpType
ORDER BY d.DeptName, EmpType
这是我的输出,似乎是正确的:

 deptname |  emptype   |       avgmnthpay
----------+------------+------------------------
 EvanDept | Mobile     |  7500.0000000000000000
 MaxDept  | Stationary | 11250.0000000000000000
 PaulDept | Mobile     |  5000.0000000000000000
 PaulDept | Stationary | 12500.0000000000000000
(4 rows)
它按部门名称和移动/固定员工分组,并计算每个组员工的平均月工资

但据我所知,这是SQL查询的顺序:

FROM
WHERE
GROUP BY
SELECT
ORDER BY
因此,GROUPBY语句发生在SELECT语句之前。那么,为什么:

按d.DeptName分组,空类型

了解SELECT语句中CASE语句中声明的EmpType吗

因此,基本上,当在选择之前计算GROUP BY时,为什么我的代码可以工作?

在派生表中执行CASE表达式:

select DeptName, EmpType, AVG(MonthlyPayScale) AS AvgMnthPay
FROM
(
  SELECT d.DeptName as DeptName,
         CASE WHEN e.WorkCity is NULL THEN 'Mobile'
              ELSE 'Stationary'
         END AS EmpType,
         e.MonthlyPayScale as MonthlyPayScale
  FROM Department d
      JOIN Employee e ON d.DeptId = e.DeptId
)
GROUP BY DeptName, EmpType
ORDER BY DeptName, EmpType

也切换到了现代的显式连接语法。更容易编写而不出错,更容易读取和维护,如果需要,也更容易转换为外部联接

您描述的处理过程通常用于解释查询的编译以及何时知道哪些标识符。SQLServer对此非常明确,并记录了它们的规则

仅仅因为SQLServer是这样做的,并不意味着所有数据库都是这样做的

因此,不同的数据库在允许在不同的子句中使用列别名方面是好是坏。MySQL和Postgres允许在GROUPBY和HAVING子句中使用列别名;Oracle和SQL Server没有。所有数据库都允许按顺序使用列别名。事实上,某些组件(如配置单元)需要列别名,不允许使用聚合函数

我相信ANSI标准在这个问题上有一些话要说。实际上是否明确是另一个问题,但不同的数据库有不同的个性


并且,本讨论涉及查询的词法分析。实际执行顺序与原始语句无关。大多数数据库引擎使用数据流引擎,并且数据流操作符和SQL结构之间没有一一对应关系。

答案是Postgresql中的名称解析允许这样做

来自Postgresql 9.3文档第7.2.3节。该集团由以下条款组成:

在严格的SQL中,GROUPBY只能按源表的列分组 但是PostgreSQL扩展了这一点,允许GROUPBY对GROUPBY列进行分组 在选择列表中。按值表达式分组而不是按简单表达式分组 也允许使用列名


我的SQL有很多种方式,这是其中一种在页面底部链接的方式。我不知道MySQL查询编译的内部工作原理,因此尽管您所述的操作顺序是正确的,但我无法确切解释为什么使用扩展名.Tag dbms。MySQL和Postgresql在分组方式上有很大的不同。一个与dbms无关的一般提示:groupby d.DeptName,e.WorkCity.My bad。。。我正在使用Postgresql。我想我应该按EmpType分组,因为我想计算不同部门名称和EmpType的平均值。我的问题更多的是,为什么在选择之前计算GROUP by时我的代码可以工作?根据ANSI SQL标准,您的查询不应该工作。我猜Postgresql开发人员有太多的人要求这个有点奇怪的扩展-调整到一个非常常见的初学者编程错误。。。其他几个dbms产品也有此扩展。