1.对sales.Orders表查询,返回2007年6月的订单
返回结果
参考
select orderid,orderdate,custid,empid
from sales.Orders
where YEAR(orderdate)=2007 and DAY(orderdate)=6
如果操作的是索引列,建议使用范围筛选
select orderid,orderdate,custid,empid
from sales.Orders
where orderdate>='20070601' and orderdate<'20070701'
2.对sales.Orders表查询, 返回每月最后一天的订单
在SQL Server 2012中你可以使用EOMONTH函数来处理此任务,像下面这样.
- select orderid,orderdate,custid,empid
- from sales.Orders
- where orderdate=EOMONTH(orderdate);
在SQL Server 2012之前,解决方案会更加复杂, 在日期和时间函数部分,我提供了下面的表达式格式来计算对应于指定时期的月份和最后一天.
- DATEADD(month,DATEDIFF(month,'19911231',date_val),'19911231')
此表达式首先计算固定的某月的最后一天(这里是1999年12月31日)与指定日期的差异月数,可称其为diff. 通过添加diff月数到固定日期, 会得到指定日期月份的最后一天,下面是完整的查询解决方案, 仅返回订单日期等于每月最后一天的订单.
- select orderid,orderdate,custid,empid
- from sales.Orders
- where orderdate=DATEADD(month,DATEDIFF(month,'19911231',orderdate),'19911231')
3.对HR.Employees表的查询, 返回姓氏包含字母"a"两次及以上次数的雇员.
使用LIKE谓词模式匹配, %表示任意大小的字符串, 包括空字符串. 因此可以使用%a%a%来表示在字符串任意位置至少出现两次字符"a".
- select empid,firstname,lastname
- from hr.Employees
- where lastname LIKE '%a%a%'
4.查询Sales.OrderDetails表, 返回总价(qty*unitprice)大于10000的订单
返回总价大于10000的订单, 单个订单明细是不符合要求的, 所有订单明细组合才符合要求
- where (qty*unitprice)>10000
这种做法是错误的, 正确写法为
- select orderid,SUM(qty*unitprice) as totalvalue
- from Sales.OrderDetails
- group by orderid
- having SUM(qty*unitprice)>10000
- order by totalvalue desc
5.在Sales.Orders表中, 返回平均运费最高的三个国家
- select top 3 shipcountry ,avg(freight) avgfreight
- from Sales.Orders
- where YEAR(orderdate)=2007
- group by shipcountry
- order by avg(freight) desc
6.Sales.Orders表, 分别对每个客户的订单按订单日期排序
select custid,orderdate,orderid,
ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate,orderid) as rownum
from Sales.Orders
ORDER BY custid,rownum