比较难实现的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