就是横向显示问题,但是有些麻烦的是where条件客户表
人名ID 人名 分类
1 A 男
2 B 男
3 C 女
4 D 男办事登记表
人名ID 登记时间
1 2008-1-1
2 2008-2-1
3 2008-2-21
3 2008-3-1
4 2008-6-1打算显示
分类 人名
男 B,D
女 C
条件是登记时间在2008-2-1后的
人名ID 人名 分类
1 A 男
2 B 男
3 C 女
4 D 男办事登记表
人名ID 登记时间
1 2008-1-1
2 2008-2-1
3 2008-2-21
3 2008-3-1
4 2008-6-1打算显示
分类 人名
男 B,D
女 C
条件是登记时间在2008-2-1后的
CREATE FUNCTION [dbo].[f_str](@id int,@hhh as varchar)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + isnull(人名,'')
FROM SelectedTopics
WHERE 分类=@id and 人名ID in (@hhh)
RETURN STUFF(@r, 1, 1, '')
END 查询语句
SELECT 分类, 人名=dbo.f_str(分类,
'select distinct 人名 from spjl where convert(datetime,登记时间,120) between ''2008-02-01 00:00:00''
and ''2008-12-31 23:59:59''') FROM SelectedTopics
GROUP BY departmentid
这样就不行但是如果去除时间(函数去除@hhh)的查询就可以。问题在那里呢?
请大家帮忙啊,真的很着急
我把函数做成
函数做了
CREATE FUNCTION [dbo].[f_str](@id int,@hhh as varchar)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + isnull(人名,'')
FROM SelectedTopics
WHERE 分类=@id and 人名ID in (select distinct 人名 from spjl where convert(datetime,登记时间,120) between '2008-02-01 00:00:00'
and '2008-12-31 23:59:59')
RETURN STUFF(@r, 1, 1, '')
END
这样都是可以的。
CREATE FUNCTION [dbo].[f_str](@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + isnull(人名,'')
FROM SelectedTopics
WHERE 分类=@id
RETURN STUFF(@r, 1, 1, '')
END 查询语句
SELECT 分类, 人名=dbo.f_str(分类) FROM SelectedTopics
GROUP BY departmentid
where 这个时间的选择
--这样就更不行了。这里没有嵌入
-- Author: happyflystone
-- Date : 2009-02-23 23:00:16
-- Ver: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
--
-------------------------------------------------------------------------- Test Data: ta
IF OBJECT_ID('ta') IS NOT NULL
DROP TABLE ta
Go
CREATE TABLE ta(人名ID INT,人名 NVARCHAR(1),分类 NVARCHAR(1))
Go
INSERT INTO ta
SELECT 1,'A','男' UNION ALL
SELECT 2,'B','男' UNION ALL
SELECT 3,'C','女' UNION ALL
SELECT 4,'D','男'
GO
-- Test Data: tb
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
Go
CREATE TABLE tb(人名ID INT,登记时间 SMALLDATETIME)
Go
INSERT INTO tb
SELECT 1,'2008-1-1' UNION ALL
SELECT 2,'2008-2-1' UNION ALL
SELECT 3,'2008-2-21' UNION ALL
SELECT 3,'2008-3-1' UNION ALL
SELECT 4,'2008-6-1'
GO
--Start
create function f_str(@fl nvarchar(2),@h datetime)
returns varchar(100)
as
begin
declare @s varchar(100)
select @s = isnull(@s+',','') + a.人名
from ta a
where exists(select 1
from tb b
where a.人名ID = b.人名ID
and datediff(d,登记时间, @h) <= 0 and a.分类 = @fl)
return @s
end
go
select a.分类,dbo.f_str(a.分类,'2008-2-1')
from ta a
group by a.分类drop function f_str
--Result:
/*
分类
---- -----------
男 B,D
女 C*/
--End
但是这个程序没有那么简单,不是有一个关联就可以了。之所以用In就是因为嵌套的语句是不固定的,而且里面本身也是3表链接。
所以特别想让程序快捷。
CREATE FUNCTION [dbo].[f_str](@id int,@hhh as varchar)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + isnull(人名,'')
FROM SelectedTopics
WHERE 分类=@id and 人名ID in (@hhh)
RETURN STUFF(@r, 1, 1, '')
END
这样的构建不可以么?
in (@hhh) ---这里不可以修改么?