SQL 查询 group by 的使用注意点
今天用SQL Server尝试实现一个SQL语句的时候,报了如标题所示的错误,通过在百度里面搜索,并亲自动手实现,终于发现问题所在,现在把它记录下来。
语句如下:
select [OrderID],[ProductID], min(UnitPrice) as MinUnitPrice
into NewDetails FROM [Northwind].[dbo].[Order Details]
Group by [OrderID]
执行该语句之后,SQL Server报错如下:
“消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'Northwind.dbo.Order Details.ProductID' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。”
百度后在这篇日志里面找到了解决办法http://blog.sina.com.cn/s/blog_41399b8b01000997.html。
正确的语句应该是这样的:
select [OrderID],[ProductID], min(UnitPrice) as MinUnitPrice
into NewDetails FROM [Northwind].[dbo].[Order Details]
Group by [OrderID],[ProductID]
之所以应该这样写,是由Group By子句决定的。下面是从MSDN中找到的关于Group By的一些知识。
Group的作用:
指定由查询表达式(Select)返回的对象要分入的组。
[ GROUP BY aliasedExpression [ ,... n ] ]
参数:
aliasedExpression
要对其执行分组的任何有效查询表达式。expression可以是属性或者是引用 FROM 子句所返回的属性的非聚合表达式。 GROUP BY 子句中的每一个表达式的求值结果必须为可比较相等性的类型。这些类型通常为标量基元类型,如数字、字符串和日期。不可按集合分组。备注:
如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每个组的汇总值。指定 GROUP BY 时,选择列表中任何非聚合表达式内的每个属性名都应包含在GROUP BY列表中,或者GROUP BY表达式必须与选择列表表达式完全匹配。
使用Group By子句的时候,一定要记住下面的一些规则:
(1)不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列;
(2)Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数;
(3)不能Group By在表中不存在的列;
(4)进行分组前可以使用Where子句消除不满足条件的行;
(5)使用Group By子句返回的组没有特定的顺序,可以使用Order By子句指定次序。
至于其它方面,可以参考上面链接的文章。
SQL 查询 group by 的使用注意点的更多相关文章
- MySQL 使用profile分析慢sql,group left join效率高于子查询
MySQL 使用profile分析慢sql,group left join效率高于子查询 http://blog.csdn.net/mchdba/article/details/54380221 -- ...
- 用SQL查询方式显示GROUP BY中的TOP解决方法[转]
用SQL查询方式显示GROUP BY中的TOP怎样用一个SQL语句来显示 分组后每个组的前几位 比如把一个学校所有学生的成绩按班级分组,再显示每个班级前五名的信息. 班级 学生 成绩 一班 ...
- 记一个简单的sql查询
在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
如何用一个SQL查询出一个班级各个学科第N名是谁? 首先贴出建表语句,方便大家本地测试: -- 建表语句 CREATE TABLE score ( id INT NOT NULL auto_incre ...
- SQL查询每个表的字段数量
--SQL查询每个表的字段数量select b.[name], count(*) As AllCount,ISNULL(ISNULL(sum(case when isnullable=0 then 1 ...
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- Atitit oodbms的查询,面向对象的sql查询jpa jpql hql
Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...
随机推荐
- 使用rabbitctl添加用户
使用rabbitctl添加用户 第一.添加mq用户并设置密码 root@live-mq-01:~ # rabbitmqctl add_user mq 123456 1 root@live-mq-01: ...
- 对Promise的研究3
Promise.race() Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例. const p = Promise.race([p1, p2, p ...
- Centos抓包方法
1. 安装tcpdump工具 rpm -ql tcpdump #查看tcpdump是否安装 本机是安装的,yum安装: yum install tcpdump 2. tcpdump抓包 根据协议和端 ...
- 使用PHPExcel操作Excel用法实例分析
本文实例分析了使用PHPExcel操作Excel用法.分享给大家供大家参考.具体分析如下: PHPExcel下载地址:http://www.codeplex.com/PHPExcel http://w ...
- 解决Windows2003 Server终端服务120天限制
用过windows server 2003做服务器的人都知道,windows2003的性能安全性比以前的windows版本高出很多,但是也带来很多麻烦.其中服务器最重要的远程管理“终端服务”居然要求授 ...
- AT3576 E Popping Balls——计数思路
题目:https://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_e 题解:https://w ...
- HihoCoder - 1104 Suzhou Adventure (树上背包)
题目:https://vjudge.net/contest/323605#problem/D 题意:给你一棵n个点的树,1点出发,然后规定k个点必须去,每个点上有一个权值,要走m个点,问最大权值是多少 ...
- Winner
Winner 南昌邀请赛 暴力模拟 #include<bits/stdc++.h> using namespace std; struct Nod { int i; int a,b,c; ...
- SpringMVC-设计模式
MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端.PHP..NET 等语言.之所以那么做的根本原因在于解耦各个模块. MVC 是 Model.View 和 Controller ...
- (转)Hyper-v 安装CentOS 7 (其他虚拟机一样参考)
转:https://www.cnblogs.com/dunitian/p/4976077.html 平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunit ...