请看上图,第一个表格是表里存储的内容。第二个表格是我想要得到的内容,请问SQL如何写?? 备注:
一、没有关联号的,则按照正常显示。有关联号的,合并规则是:有【关联号】的 那么相同的关联号合并成一行显示,这行里面,如果某字段内容相同,则合并后,不重复显示内容。例如上图中的关联号:【20030108】,由于性别相同,所以合并后,重复的性别就不显示了,而专业却不相同,所以合并后,都显示。二、上图表中,我只是列举了几个典型的字段,实际上大概有50个字段左右,记录也是列举了典型的几条。但需要的结果显示规则都是一样的。请问这个SQL如何写呢??或者说这样的效果如何实现呢??

解决方案 »

  1.   

    SQL输出, 是不能跨行显示的, 你的这个不是SQL问题, 是报表问题!
      

  2.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([姓名] [nvarchar](10),[性别] [nvarchar](10),[专业] [nvarchar](10),[关联号] [nvarchar](10))
    INSERT INTO [tb]
    SELECT 'a1','男','文科','20030108' UNION ALL
    SELECT 'a2','男','文科',NULL UNION ALL
    SELECT 'a3','男','理科','20030108' UNION ALL
    SELECT 'a4','男','理科',NULL UNION ALL
    SELECT 'a5','女','文科','20040223'--SELECT * FROM [tb]-->SQL查询如下:
    ;WITH t AS 
    (
    SELECT rn=ROW_NUMBER()OVER(PARTITION BY ISNULL(关联号,CHECKSUM(*)) ORDER BY 姓名),*
    FROM tb 
    )
    SELECT 姓名,
       性别=CASE rn 
     WHEN 1 THEN 性别
     ELSE '' 
    END,
       专业,
       关联号=CASE rn 
     WHEN 1 THEN 关联号
     ELSE '' 
    END
    FROM t
    ORDER BY CASE 性别 WHEN '女' THEN 1 ELSE 0 END
    /*
    姓名         性别         专业         关联号
    ---------- ---------- ---------- ----------
    a1         男          文科         20030108
    a3                    理科         
    a2         男          文科         NULL
    a4         男          理科         NULL
    a5         女          文科         20040223(5 行受影响)
    */?
      

  3.   

    呵呵,你这不是sql要做的事情,是report或gridview合并行和单元格的问题,,程序解决更好
      

  4.   

    --> 生成测试数据表: [tb]
    --借用TONY哥的语句,给分请给3楼
    IF OBJECT_ID('[tb]') IS NOT NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([姓名] [nvarchar](10),[性别] [nvarchar](10),[专业] [nvarchar](10),[关联号] [nvarchar](10))
    INSERT INTO [tb]
    SELECT 'a1','男','文科','20030108' UNION ALL
    SELECT 'a2','男','文科',NULL UNION ALL
    SELECT 'a3','男','理科','20030108' UNION ALL
    SELECT 'a4','男','理科',NULL UNION ALL
    SELECT 'a5','女','文科','20040223'--SELECT * FROM [tb]
        SELECT rn=ROW_NUMBER()OVER(PARTITION BY ISNULL(关联号,CHECKSUM(*)) ORDER BY 姓名),*
    INTO #T
        FROM tb SELECT 姓名,
           性别=CASE rn 
                     WHEN 1 THEN 性别
                     ELSE '' 
                END,
           专业,
           关联号=CASE rn 
                     WHEN 1 THEN 关联号
                     ELSE '' 
                END
    FROM #t
    ORDER BY CASE 性别 WHEN '女' THEN 1 ELSE 0 END
    /*
    姓名         性别         专业         关联号
    ---------- ---------- ---------- ----------
    a1         男          文科         20030108
    a3                    理科         
    a2         男          文科         NULL
    a4         男          理科         NULL
    a5         女          文科         20040223(5 行受影响)
    */