当前位置: 代码迷 >> Sql Server >> sql 面试题 请高手解答,很急候!
  详细解决方案

sql 面试题 请高手解答,很急候!

热度:439   发布时间:2016-04-24 18:27:48.0
sql 面试题 请高手解答,很急!!!,在线等候!,
sql 面试题:明天就用,非常感谢您的回答。
我在线等候!!
一、要求:
一个完整的项目,共3个页面(页面样式无要求),2个表,自己设计表,用存储过程写
二、详细说明
1. 现在有4个人 分别是张三、李四、王五、赵二,关系如下图

                    张三
                   /   \
                李四    赵二
                 /
               王五


2. 需要在页面显示如下
标识 姓 名 级别
1 张 三 一级
2 李 四 二级
3 王 五 三级
4 赵 二 二级

3. 他们每天花的钱数和统计总数,在页面显示如下
姓名 周一 周二 周三 周四 周五 周六 周日 总花钱数(需要计算出来)
张三 100 30 300 40 100 30 200 800
李四 150 20 100 50 150 80 100 650
王五 200 100 200 50 200 50 100 900
赵二 150 200 100 50 60 140 200 900



4. 现在需要显示出这3个人总花钱数,页面显示如下
标识 姓名 图关系一周总花钱
1 张三 (张三+李四+王五+赵二)
2 李四 (李四+王五)
3 王五 (王五)
4 赵二 (赵二)

------解决方案--------------------
1. 树状结构的表格设计基本如下:
ID, parentID, infos....

2.表格2:列名:姓名,费用,日期
select 
  姓名,
  Case 
    when DATEPART( WEEKDAY,getdate()) =1 then 费用 end as '周一',
    Case 
    when DATEPART( WEEKDAY,getdate()) =2 then 费用 end as '周二'
....
from 表格2

3. 根据关系图,把姓名集合找出来,然后求和
------解决方案--------------------
use tempdb;
go
IF OBJECT_ID('dbo.users','U') IS NOT NULL    DROP TABLE dbo.users;
IF OBJECT_ID('dbo.users_money','U') IS NOT NULL    DROP TABLE dbo.users_money;
--创建人员信息表
CREATE TABLE users (id INT NOT NULL,name varchar(50) NOT NULL,manager INT );
?
INSERT INTO users VALUES 
(1,'张三',0),(2,'李四',1),(3,'赵二',1),(4,'王五',2),(5,'陈六',2)
?
?
----创建费用表
CREATE TABLE users_money([userid] INT,[date] date,[money] INT);
?
INSERT INTO users_money VALUES
(1,GETDATE(),FLOOR(RAND()*100)),
(1,DATEADD(DAY,1,GETDATE()),FLOOR(RAND()*100)),
(1,DATEADD(DAY,2,GETDATE()),FLOOR(RAND()*100)),
(1,DATEADD(DAY,3,GETDATE()),FLOOR(RAND()*100)),
(1,DATEADD(DAY,4,GETDATE()),FLOOR(RAND()*100)),
(1,DATEADD(DAY,5,GETDATE()),FLOOR(RAND()*100)),
(1,DATEADD(DAY,6,GETDATE()),FLOOR(RAND()*100)),
(2,GETDATE(),FLOOR(RAND()*100)),
(2,DATEADD(DAY,1,GETDATE()),FLOOR(RAND()*100)),
(2,DATEADD(DAY,2,GETDATE()),FLOOR(RAND()*100)),
(2,DATEADD(DAY,3,GETDATE()),FLOOR(RAND()*100)),
(2,DATEADD(DAY,4,GETDATE()),FLOOR(RAND()*100)),
(2,DATEADD(DAY,5,GETDATE()),FLOOR(RAND()*100)),
(2,DATEADD(DAY,6,GETDATE()),FLOOR(RAND()*100)),
(3,GETDATE(),FLOOR(RAND()*100)),
(3,DATEADD(DAY,1,GETDATE()),FLOOR(RAND()*100)),
(3,DATEADD(DAY,2,GETDATE()),FLOOR(RAND()*100)),
(3,DATEADD(DAY,3,GETDATE()),FLOOR(RAND()*100)),
(3,DATEADD(DAY,4,GETDATE()),FLOOR(RAND()*100)),
(3,DATEADD(DAY,5,GETDATE()),FLOOR(RAND()*100)),
(3,DATEADD(DAY,6,GETDATE()),FLOOR(RAND()*100)),
(4,GETDATE(),FLOOR(RAND()*100)),
(4,DATEADD(DAY,1,GETDATE()),FLOOR(RAND()*100)),
(4,DATEADD(DAY,2,GETDATE()),FLOOR(RAND()*100)),
(4,DATEADD(DAY,3,GETDATE()),FLOOR(RAND()*100)),
(4,DATEADD(DAY,4,GETDATE()),FLOOR(RAND()*100)),
(4,DATEADD(DAY,5,GETDATE()),FLOOR(RAND()*100)),
(4,DATEADD(DAY,6,GETDATE()),FLOOR(RAND()*100)),
(5,GETDATE(),FLOOR(RAND()*100)),
(5,DATEADD(DAY,1,GETDATE()),FLOOR(RAND()*100)),
(5,DATEADD(DAY,2,GETDATE()),FLOOR(RAND()*100)),
(5,DATEADD(DAY,3,GETDATE()),FLOOR(RAND()*100)),
(5,DATEADD(DAY,4,GETDATE()),FLOOR(RAND()*100)),
(5,DATEADD(DAY,5,GETDATE()),FLOOR(RAND()*100)),
(5,DATEADD(DAY,6,GETDATE()),FLOOR(RAND()*100));
-----
?
----以下为需求实现 页面1
WITH users_managers AS(
SELECT id,name,manager,1 AS level,','+CAST(id AS VARCHAR(max)) ids
FROM users WHERE manager=0 --根节点的0
UNION ALL 
SELECT b.id,b.name,b.manager,1+a.level,a.ids+','+CAST(b.id AS VARCHAR(max))
FROM users AS b INNER JOIN users_managers AS a ON b.manager=a.id
)
SELECT id,name,level,ids  --ids是一个非常有趣的列,他记录了一个元素的绝对路径,从这个路径中,可以看到这个元素的所有上级及本身的信息
FROM users_managers
ORDER BY ids ;
-----
?
----页面2
WITH users_managers AS(
SELECT id,name,manager,1 AS level,','+CAST(id AS VARCHAR(max)) ids
FROM users WHERE manager=0 --根节点的0
UNION ALL 
SELECT b.id,b.name,b.manager,1+a.level,a.ids+','+CAST(b.id AS VARCHAR(max))
FROM users AS b INNER JOIN users_managers AS a ON b.manager=a.id
),
 a AS
(SELECT a.id,a.ids,a.name,DATEPART(WEEKDAY,b.date) AS WEEKDAY,b.money FROM users_managers a INNER JOIN  users_money b ON a.id=b.userid
)
SELECT id,name,[1],[2],[3],[4],[5],[6],[7],[1]+[2]+[3]+[4]+[5]+[6]+[7] AS sumweek FROM a
  相关解决方案