项目表:记录项目基本信息。
房间表:记录房间基本信息,一个项目有多个房间,一个房间只属于一个项目。
收款表:一个房间会有多笔款项类型、款项名称不一样的收款,一笔收款信息只属于一个房间。
项目表:s_project
字段名称 中文含义 类型 长度
Companycode 公司代码 Varchar 50
Company 公司名称 Varchar 50
ParentProjCode 父级代码 Varchar 50
projguid 项目GUID Unqiueidentifier
Projcode 项目代码 Varchar 50
Projname 项目名称 Varchar 50
Kpdate 开盘日期 DateTime
房间表:s_room
字段名称 中文含义 类型 长度
projguid 项目GUID Unqiueidentifier
Projcode 项目代码 Varchar 50
roomguid 房间GUID Unqiueidentifier
Roomcode 房间代码 Varchar 50
roomno 房号 Varchar 50
Price 标准单价 Money
Total 标准总价 Money
Bldarea 建筑面积 Money
Cjprice 成交单价 Money
Qsdate 签署日期 DateTime
Cjtotal 成交总价 Money
Ajfkdate 按揭放款日期 DateTime
Status 销售状态 Varchar 50
收款表:s_getin
字段名称 中文含义 类型 长度
roomguid 房间GUID Unqiueidentifier
Roomcode 房间代码 Varchar 50
itemtype 款项类型 varchar 50
Itemname 款项名称 Varchar 50
Getdate 收款日期 DateTime
getinguid 收款GUID Unqiueidentifier
Amount 收款金额 Money
一、 SQL(共6题,前4题每题10分,后两题每题5分,共50分):
1) 用一个T-SQL语句统计每一个项目款项类型为非贷款类房款的收款金额合计(s_getin.itemtype=’非贷款类房款’)、款项类型为贷款类房款((s_getin.itemtype=’贷款类房款’))的收款金额合计
预期结果:
项目名称 非贷款类房款 贷款类房款
翡翠绿洲一期 100000 300000
汇景新城一期 200000 400000
SELECT MAX(A.Projname) AS ‘项目名称’, sum(case when C.ITEMTYPE=’非贷款类房款’then C. S_GETIN ELSE 0) AS ‘非贷款类房款’, sum(case when C.ITEMTYPE='贷款类房款’then C. S_GETIN ELSE 0) AS ‘贷款类房款’FROM S_PROJECT A,S_ROOM B,S_GETIN C
WHERE A.projguid =B. projguid AND B.roomguid= C.roomguid
GROUP BY A.projguid
,
2) 用一个T-SQL语句查询在项目开盘当日成交的房间(s_project.kpdate=s_room.qsdate)及每个房间的收款合计(s_getin之和),显示公司名称、父级项目名称、项目名称、房间代码、房号、建筑面积、标准单价、标准总价、签署日期、成交单价、成交总价、销售状态,收款金额合计
说明:项目开盘当日:项目表(s_project)开盘日期
成交的房间:房间表(s_room)销售状态为签约
SELECT MAX(A.Company) AS ‘公司名称’, MAX(A.ParentProjCode) AS ‘父级项目名称’,MAX(A.Projname) AS ‘项目名称’,C.roomguid‘房间代码’, MAX(B.roomno) AS‘房号’, MAX(B.Bldarea) AS ’建筑面积’, MAX(B.Price) AS ’标准单价’, MAX(B.Total) AS ’标准总价’, MAX(B.Qsdate) AS’签署日期’, MAX(B.Cjprice) AS’成交单价’,MAX(B.Cjtotal) AS’成交总价’,MAX(B.Status) AS ’销售状态’,SUM( C.Amount)AS’收款金额合计’ FROM S_PROJECT A,S_ROOM B,S_GETIN C
WHERE A.projguid =B. projguid AND B.roomguid= C.roomguid AND A.kpdate=B.qsdate and s_room=’签约’GROUP BY C.roomguid,B.projguid
3) 用一个T-SQL语句查询所有销售状态为‘签约’的房间收款金额合计不等于成交总价的记录,并计算出差额(s_getin.amout之和<>s_room.cjtotal),要求使用having关键字
SELECT
C.ROOMGUID,MAX(Roomcode),SUM(C.amout)-MAX((B.Cjtotal)
FROM S_ROOM B,S_GETIN C
WHERE B.roomguid= C.roomguid AND B.Status=’签约’
GROUP BY C.roomguid
HAVING SUM(C.Amount)<>MAX(B.Cjtotal)
4) 更新所有已经收取银行按揭金额房间(存在s_getin.itemname=‘银行按揭’的房间)的按揭放款日期(s_room.ajfkdate)为该房间银行按揭收款的收款日期(s_getin.getdate)
UPDATE B SET B.ajfkdate= C.getdate FROM S_ROOM B
inner join S_GETINCB.ajfkdate=C.getdate
WHERE B.itemname=‘银行按揭’
5) 查询各项目的房间的成交总价(s_room.cjtotal)在该项目降序排序为第6到第10的房间的项目名称、房间代码、累计收款金额 (s_getin.amount之和)
SELECT ROWNUM ,SUM(B.cjtotal) TOTAL,
MAX(A.Projname) AS ‘项目名称’,
MAX(Roomcode) AS‘房间代码’,
SUM(C.amounT) AS‘累计收款金额’,
FROM S_PROJECT A,S_ROOM B,S_GETIN C
WHERE
A.projguid =B. projguid AND B.roomguid= C.roomguid AND
ROWNUM BETWEEN 6 AND 10
BROUP BY B.roomguid
ORDER BY TOTAL DESC
6) 创建一个表函数 fn_salesum(y int,mint)5
参数定义:y 为年份,m 为 月份
返回值定义:return {项目名称 varchar(100),上旬销售套数 int,中旬销售套数 int,下旬销售套数int}
项目名称 Varchar(100)
上旬销售套数 int
中旬销售套数 int
下旬销售套数 int
要求输入年份和月份,输出每个项目该月份在上旬、中旬、下旬分别销售的套数(s_room.Status=’已售’)。
时间维度定义:每月1日-10日为上旬,11日-20日为中旬,21日到月末为下旬。
Create function fn_salesum
(
@y int,
@m int
)
RETURNS @ret TABLE (
Itemnamevarchar(100),
B_totalint,
M_totalint,
E_totalint
)
asdeclare @v_zoneIdvarchar(100);--项目名称
declare @v_streetIdint;--上旬销售套数
declare @v_residint;--中旬销售套数
declare @v_areaLevelint;--下旬销售套数
begin
insert into @ret
select MAX(A.Projname),
SUM(CASE WHENMAX(B. Qsdate) BETWEEN @y+@m+’1’ AND @y+@m+’10’ then 1 ELSE 0) ,
SUM(CASE WHEN MAX(B. Qsdate) BETWEEN @y+@m+’11’ AND @y+@m+’20’ then 1 ELSE 0) ,
SUM(CASE WHEN MAX(B. Qsdate)>@y+@m+’20’ then 1 ELSE 0) ,
FROM S_PROJECT A, S_ROOM B
Where A.projguid =B. projguid
Group A. projguid;
RETURN;
end;
2 个解决方案
#1
这个.net有个啥关系?全是sql嘛,找本数据库的书原理看看
#2
就是让你去写SQL,多看看基础,基本上都没有问题。
#1
这个.net有个啥关系?全是sql嘛,找本数据库的书原理看看
#2
就是让你去写SQL,多看看基础,基本上都没有问题。