数据库中有表A:A1,A2(若干条数据)
1,A
2,B
3,C
4,D
5,E
6,F
......要求:满足某一条件(比如:A1=2 or A1=3 or A1=6),输出未这样:
(1)B;(2)C;(3)F。
即得到A1满足某条件的所有的A2值,然后,输出时得到的第一个A2的值写在最前,写成这样(1)B加上分号,第二个接着前面写成(2)C加上分号,......(注意写完后,最后是句号,前面用分号)我要求语句写成:
select ????? from A where 对A1的条件(比如:A1=2 or A1=3 or A1=6)  中间 问号部分 不会。请问有无办法?

解决方案 »

  1.   

    --> liangCK小梁 于2008-10-23
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (col1 INT,col2 VARCHAR(1))
    INSERT INTO #T
    SELECT 1,'A' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 4,'D' UNION ALL
    SELECT 5,'E' UNION ALL
    SELECT 6,'F'--SQL查询如下:SELECT '('+RTRIM((SELECT COUNT(*)+1
            FROM #T
            WHERE col1 IN(2,3,6)
             AND col1<t.col1))+')'+col2
    FROM #T AS t
    WHERE col1 IN(2,3,6);/*
    ---------------
    (1)B
    (2)C
    (3)F(3 行受影响)*/
      

  2.   

    --> liangCK小梁 于2008-10-23
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (col1 INT,col2 VARCHAR(1))
    INSERT INTO #T
    SELECT 1,'A' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 4,'D' UNION ALL
    SELECT 5,'E' UNION ALL
    SELECT 6,'F'--SQL查询如下:SELECT '('+RTRIM(ROW_NUMBER() OVER(ORDER BY col1))+')'+col2 AS col
    FROM #T AS t
    WHERE col1 IN(2,3,6);/*
    col
    ---------------------------
    (1)B
    (2)C
    (3)F(3 行受影响)*/
      

  3.   

    要合并的话..看这个..问题描述:
    无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
      所以,当我们在处理下列要求时,会比较麻烦:
    有表tb, 如下:
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     values
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即, group by id, 求 value 的和(字符串相加)1. 旧的解决方法-- 1. 创建处理函数
    CREATE FUNCTION dbo.f_str(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + value
        FROM tb
        WHERE id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    -- 调用函数SELECt id, values=dbo.f_str(id) 
    FROM tb 
    GROUP BY id-- 2. 新的解决方法 
    -- 示例数据
    DECLARE @t TABLE(id int, value varchar(10))
    INSERT @t SELECT 1, 'aa'
    UNION ALL SELECT 1, 'bb'
    UNION ALL SELECT 2, 'aaa'
    UNION ALL SELECT 2, 'bbb'
    UNION ALL SELECT 2, 'ccc'-- 查询处理
    SELECT *
    FROM(
        SELECT DISTINCT 
            id
        FROM @t
    )A
    OUTER APPLY(
        SELECT 
            [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT value FROM @t N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N value="', ','), '"/>', ''), 1, 1, '')
    )N/*--结果
    id          values
    ----------- ----------------
    1           aa,bb
    2           aaa,bbb,ccc
    (2 行受影响)
    --*/CSDN 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:
    在安装sql 2005的示例后,默认安装目录为
    drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中
      

  4.   

    --> liangCK小梁 于2008-10-23
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.T') IS NOT NULL DROP TABLE T
    CREATE TABLE T (col1 INT,col2 VARCHAR(1))
    INSERT INTO T
    SELECT 1,'A' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 4,'D' UNION ALL
    SELECT 5,'E' UNION ALL
    SELECT 6,'F'--SQL查询如下:GOCREATE FUNCTION dbo.f_str(@id VARCHAR(50))
      RETURNS varchar(50)
    AS
    BEGIN
        DECLARE @r varchar(8000),@i int;
        SET @r = ''
        SET @i=1
        SELECT @r=@r + ';' + '('+RTRIM(@i)+')'+col2,
               @i=@i+1
        FROM T
        WHERE CHARINDEX(','+RTRIM(col1)+',',','+@id+',')>0
        RETURN STUFF(@r, 1, 1, '')+'.'
    END
    GOSELECT dbo.f_str('2,3,6') colDROP TABLE T
    DROP FUNCTION dbo.f_str/*
    col
    --------------------------------------------------
    (1)B;(2)C;(3)F.(1 行受影响)*/
      

  5.   

    SQL code--> liangCK小梁 于2008-10-23
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (col1 INT,col2 VARCHAR(1))
    INSERT INTO #T
    SELECT 1,'A' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 4,'D' UNION ALL
    SELECT 5,'E' UNION ALL
    SELECT 6,'F'--SQL查询如下:SELECT '('+RTRIM((SELECT COUNT(*)+1
            FROM #T
            WHERE col1 IN(2,3,6)
             AND col1<t.col1))+')'+col2
    FROM #T AS t
    WHERE col1 IN(2,3,6);/*
    ---------------
    (1)B
    (2)C
    (3)F(3 行受影响)*/
      

  6.   

    SQL code--> liangCK小梁 于2008-10-23
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (col1 INT,col2 VARCHAR(1))
    INSERT INTO #T
    SELECT 1,'A' UNION ALL
    SELECT 2,'B' UNION ALL
    SELECT 3,'C' UNION ALL
    SELECT 4,'D' UNION ALL
    SELECT 5,'E' UNION ALL
    SELECT 6,'F'--SQL查询如下:SELECT '('+RTRIM((SELECT COUNT(*)+1
            FROM #T
            WHERE col1 IN(2,3,6)
             AND col1<t.col1))+')'+col2
    FROM #T AS t
    WHERE col1 IN(2,3,6);/*
    ---------------
    (1)B
    (2)C
    (3)F(3 行受影响)*/正解