首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

比较难实现的SQL语句,请高手帮忙!(关于一个车辆预约系统),该怎么处理

2012-02-22 
比较难实现的SQL语句,请高手帮忙!(关于一个车辆预约系统)以下是预约表-----------------------预约人同乘

比较难实现的SQL语句,请高手帮忙!(关于一个车辆预约系统)
以下是预约表
-----------------------
预约人               同乘人数     班次                   预约时间                                       备注    
刘洪             112007-04-09   00:00:00NULL
刘二             122007-04-09   00:00:00NULL
张三             032007-04-09   00:00:00NULL
李四             042007-04-09   00:00:00NULL
王五             132007-04-09   00:00:00NULL
周六             112007-04-09   00:00:00NULL
admin           122007-04-09   00:00:00NULL
-------------------------
希望得到以下这个表
---------------------------------
预约人                     同乘人数               总人数     班次                   预约时间                   备注    
刘洪   周六         刘洪(1)   周六(1)           4             1                       2007-04-09               NULL
刘二   admin       刘二(1)   admin(1)         2         2                       2007-04-09               NULL
张三   王五         张三(0)   王五(1)           3             3                       2007-04-09                 NULL
李四                   李四(0)                           1             4                       2007-04-09                 NULL
-----------------------------------
条件:按照班次分组,将预约相同班次的预约人合并到一个字段并用空格分开,同时将每个预约人
所带同乘者人数附后并用括号括起来,总人数=预约人+同乘人数。预约时间只取最近的日期相同的
日期部分,不取时间。不知道我说明白了没有,在线等!

[解决办法]
如果不要合并就比较简单了
group by 班次 order by 班次

关注一下
[解决办法]
up
[解决办法]
学习~~
不过想问下
刘二 admin 刘二(1) admin(1) 2 2 2007-04-09 NULL

那个总人数是2???
是不是该是4啊???按你说的
总人数=预约人+同乘人数
[解决办法]
这种合并还是用程序写吧,SQL语句很难实现的,比较麻烦
[解决办法]
字符串合并没有办法,加上函数应该可以,我写了一个测试的例子:
--建表
create table mytest
(
mnamevarchar(50),
numint,
partint


)

insert into mytest(mname,num,part) values( '刘洪 ',1,1);
insert into mytest(mname,num,part) values( '刘二 ',1,2);
insert into mytest(mname,num,part) values( '张三 ',0,3);
insert into mytest(mname,num,part) values( '李四 ',0,4);
insert into mytest(mname,num,part) values( '王五 ',1,3);
insert into mytest(mname,num,part) values( '周六 ',1,1);
insert into mytest(mname,num,part) values( 'admin ',1,2);

--建立两个合并字符串的函数
IF EXISTS (SELECT *
FROM sysobjects
WHERE name = 'FN_GetNames_For_Test ')
DROP FUNCTION FN_GetNames_For_Test
GO
CREATE FUNCTION dbo.FN_GetNames_For_Test(@p_part int)
RETURNS VARCHAR(100) AS
BEGIN
DECLARE @ReturnValue VARCHAR(100)
DECLARE @mname VARCHAR(30)

DECLARE names_cursor CURSOR FOR
SELECT mname FROM mytest WHERE part=@p_part

SET @ReturnValue = ' '

OPEN names_cursor

FETCH NEXT FROM names_cursor INTO @mname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ReturnValue = @ReturnValue + @mname + ' '
FETCH NEXT FROM names_cursor INTO @mname
END

CLOSE names_cursor

RETURN @ReturnValue
END
GO

IF EXISTS (SELECT *
FROM sysobjects
WHERE name = 'FN_GetNames_For_Test2 ')
DROP FUNCTION FN_GetNames_For_Test2
GO
CREATE FUNCTION dbo.FN_GetNames_For_Test2(@p_part int)
RETURNS VARCHAR(100) AS
BEGIN
DECLARE @ReturnValue VARCHAR(100)
DECLARE @mname VARCHAR(30)
DECLARE @num int

DECLARE names_cursor CURSOR FOR
SELECT mname,num FROM mytest WHERE part=@p_part

SET @ReturnValue = ' '

OPEN names_cursor

FETCH NEXT FROM names_cursor INTO @mname,@num
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ReturnValue = @ReturnValue + @mname + '( ' + convert(varchar,@num) + ') ' + ' '
FETCH NEXT FROM names_cursor INTO @mname,@num
END

CLOSE names_cursor

RETURN @ReturnValue
END
GO

--应用
select
dbo.FN_GetNames_For_Test(part),
dbo.FN_GetNames_For_Test2(part),
part,
sum(1+isnull(num,0))
from mytest
group by
dbo.FN_GetNames_For_Test(part),
dbo.FN_GetNames_For_Test2(part),
part

order by part

--结果
刘洪 周六 刘洪(1) 周六(1) 14
刘二 admin 刘二(1) admin(1) 24
张三 王五 张三(0) 王五(1) 33
李四 李四(0) 41

热点排行