就是横向显示问题,但是有些麻烦的是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后的

解决方案 »

  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)的查询就可以。问题在那里呢?
    请大家帮忙啊,真的很着急
      

  2.   

    人名ID in (@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 
    这样都是可以的。
      

  3.   

    函数的参数直接用性别,然后select时再加where
      

  4.   

    如果函数去除@hhh
    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 这个时间的选择
    --这样就更不行了。这里没有嵌入
      

  5.   

    ------------------------------------------------------------------------
    -- 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 
      

  6.   

    十分感谢happyflystone 的帮忙。
    但是这个程序没有那么简单,不是有一个关联就可以了。之所以用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) ---这里不可以修改么?