Sql Server 一则训练题


(1) 在图上补齐CustomersAddressesItemsCategorys 这几个表的各字段的类型。

(2) 列出订单编号(OrderID)为80007的订单所销售的商品的名称(Name)、定购数量(Quantity)、单价(UnitPrice)。

--注意UnitPriceOrderItemsItems表都有,如果能理解这些表结构的话,可以发现历史订单上的价格应该是在OrderItems,Items表记录的是当前的价格

select [Name],Quantity,OrderItems.UnitPrice from Items,OrderItems

where Items.ItemID = OrderItems.ItemID and OrderItems.OrderID = 80007


(3) 查询出客户编号(CustomerID)为1001的客户在2008年上半年所有定购过的订单的编号(OrderID)、日期(OrderDate)、该订单总金额,按日期从小到大排列。

--注意限制时间的写法,如果要用2008-01-01这样的日期也可以,最好转换为日期型。

select Orders.OrderID,OrderDate,SUM(UnitPrice*Quantity) as OrderTotalAmount 

from Orders,OrderItems

where Orders.OrderID=OrderItems.OrderID

and CustomerID = 1001

and month(OrderDate) <= 6 and year(OrderDate) = 2008

group by Orders.OrderID,OrderDate

order by OrderDate


(4) 查询商品名称(Name)’BENQ EL71’的商品在去年的销售汇总情况。

请按月份汇总,列出月份、销售数量2个字段。

select Month(Orders.OrderDate) as [Month],SUM(Quantity) as TotalQty 

from Items,Orders,OrderItems

where Items.ItemID = OrderItems.ItemID 

and Orders.OrderID=OrderItems.OrderID

and Items.[Name] = 'BENQ EL71'

and Year(OrderDate)= Year(getdate())- 1

group by Month(Orders.OrderDate)

order by Month(Orders.OrderDate)


(5) 删除订单日期(OrderDate)在2000年及之前的所有订单(包括Orders表和OrderItems表中的资料)

--注意删除的顺序,因为Orders表和OrderItems表是有主外键关系的,所以如果先删Orders会不成功。

先运行:

delete OrderItems where OrderID in 

(select OrderID from Orders where Year(OrderDate)<=2000) 

再运行:

delete Orders where Year(OrderDate)<=2000


(6) 更新所有商品的名称(Name)及描述(Description),把中间含有‘BENQ’的字符串替换为‘明基’

--注意 Where [name] like '%BENQ%' or description like '%BENQ%'可有可无。

update items set [name] = Replace([name],'BENQ','明基'), 

description = replace(description,'BENQ','明基')


(7) 写一个Functionudf_getAddressDetailByOrderID(OrderID),用来返回某张订单对应的详细送货地址。

送货地址显示格式为:Country + ’,’ + Address + ’,电话:’+ PhoneNumber

例如: “中国,河南省郑州市金水区纬五路9号楼东单元,电话:1301588975”

--注意 Orders表和Addresses表的串连:“Orders.ShipToAddressID=Addresses.AddressID”。

CREATE FUNCTION udf_getAddressDetailByOrderID(@OrderID int)

RETURNS nvarchar(300)

AS

BEGIN

DECLARE @AddressDetail nvarchar(300)

SELECT @AddressDetail = Country + ',' + Address + ',电话:'+ PhoneNumber

FROM Orders,Addresses

WHERE Orders.ShipToAddressID = Addresses.AddressID and OrderID = @OrderID

RETURN @AddressDetail

END

调用:Select dbo.udf_getAddressDetailByOrderID(XXX)


(8) 写一个Store Procedureudp_modifyUnitPriceOfTop3Item,用来把每个类别(Category)下上个月销售数量居前3位的商品的单价(Item.UnitPrice)上涨2%(不考虑Category的递归,若销售数量相同,则随机取)

--注意“上个月”不要写死是20089月,要用函数来动态取得,写法有很多种。

CREATE PROCEDURE udp_modifyUnitPriceOfTop3Item

    @CategoryID int

AS

BEGIN

update Items set UnitPrice = UnitPrice * 1.02 

where ItemID in (

select top 3 Items.ItemID

from Items,Orders,OrderItems

where Items.ItemID=OrderItems.ItemID

and Orders.OrderID=OrderItems.OrderID

and OrderDate>=DATEADD(mm,DATEDIFF(mm,0,getdate())-1,0) -- >=上月第一天

and OrderDate< DATEADD(mm,DATEDIFF(mm,0,getdate()),0)  -- <上月第一天

and CategoryID = @CategoryID

group by Items.ItemID

order by SUM(OrderItems.quantity) desc

) 

END

调用:exec dbo.udp_modifyUnitPriceOfTop3Item XXX

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值