谢谢回复,我已看过你的案例,但是我要的是如果同一单号,SH003列有相同话,那么SH004的值是相加的,不是统计或显示出来。
也就是说原表可能有七行,但查询出来后,会处理相同单号(SH002)的数据,并合并SH004列的值,这样显示出来可能就只有五行或更少

解决方案 »

  1.   


    不好意思,我描述有问题。
    表A的记录如下:
    SH001             SH002                                 SH003                     SH004  
    1                     C-20090013                     采购课                     414-200905                  
    2                     C-20090012                     采购课                     047-200504                  
    3                     C-20090016                     工程一部                 427-200303                  
    5                     C-20090015                     工程一部                 427-200303                  
    7                     C-20090013                     采购课                     222-200301              
    9                     C-20090014                     采购课                     222-200301          
    5                     C-20090015                     工程二部                 981-200801      
    说明:SH001为流水号(自增的标识符)    
    现在要如何把查询的结果显示成:
    序号               单号                                                                                                 部门  
                                                                  采购课                                                   工程一部                         工程二部
    1                     C-20090013                     414-200905,222-200301                  
    2                     C-20090012                     047-200504                  
    3                     C-20090016                                                                                   427-200303                            
    4                     C-20090014                     222-200301    
    5                     C-20090015                                                                                   427-200303                     981-200801                                        
    说明:序号是查询有时候显示出来的一列,相当于第几行的一个编号,也可以不要此列!请问应该如何实现上面的功能呢?谢谢! 
      

  2.   

     IF OBJECT_ID('LI') IS NOT NULL
       DROP TABLE LI CREATE TABLE LI (SH001 INT ,SH002 VARCHAR(20),SH003 VARCHAR(20),SH004 VARCHAR(20)) 
    INSERT INTO LI (SH001,SH002,SH003,SH004)
    SELECT 1, 'C-20090013', '采购课', '414-200905' UNION ALL
    SELECT 2, 'C-20090012', '采购课', '047-200504' UNION ALL
    SELECT 3, 'C-20090016', '工程一部 ', '427-200303' UNION ALL
    SELECT 5, 'C-20090015', '工程一部', '427-200303' UNION ALL
    SELECT 1, 'C-20090013', '采购课', '222-200301' UNION ALL
    SELECT 9, 'C-20090014', '采购课', '222-200301' UNION ALL
    SELECT 5, 'C-20090015', '工程二部', '981-200801' 
     --查询结果
    SELECT SH001,SH002,
           MAX(CASE SH003 WHEN '采购课'  THEN  ISNULL(SH004,'') ELSE '' END)   AS 采购课,
           MAX(CASE SH003 WHEN '工程一部' THEN ISNULL(SH004,'') ELSE '' END)   AS 工程一部,
           MAX(CASE SH003 WHEN '工程二部' THEN ISNULL(SH004,'') ELSE '' END)   AS 工程一部  
    FROM LI 
    GROUP BY  SH001,SH002  
    ORDER BY SH001,SH002       
    /*  结果
         SH001  SH002         采购课         工程一部    工程二部
          2    C-20090012   047-200504
          1    C-20090013   414-200905
          9    C-20090014   222-200301
          5    C-20090015                  427-200303   981-200801
          3    C-20090016                  427-200303
    */
      

  3.   

    要不要序号都无所谓了,楼主给的序号看起来不像是自增列。
    /*--参考
    CREATE TABLE #A (SH001 INT,SH002 VARCHAR(20),SH003 VARCHAR(80),SH004 VARCHAR(20))
    INSERT INTO #A
    SELECT 1,'C-20090013','采购课','414-200905' UNION ALL
    SELECT 2,'C-20090012','采购课','047-200504' UNION ALL
    SELECT 3,'C-20090016','工程一部','427-200303' UNION ALL
    SELECT 5,'C-20090015','工程一部','427-200303' UNION ALL
    SELECT 7,'C-20090013','采购课','222-200301' UNION ALL
    SELECT 9,'C-20090014','采购课','222-200301' UNION ALL
    SELECT 5,'C-20090015','工程二部','981-200801'
    /*
    SH001 SH002 采购课 工程一部 工程二部
    2 C-20090012 047-200504
    1 C-20090013 414-200905
    7 C-20090013 222-200301
    9 C-20090014 222-200301
    5 C-20090015 427-200303 981-200801
    3 C-20090016 427-200303
    */
    ;with CTE as (
    Select SH001,SH002,ISNULL(采购课,'') 采购课,ISNULL(工程一部,'') 工程一部,ISNULL(工程二部,'') 工程二部
    from (Select SH001,SH002,SH003,SH004 from #A ) a pivot (max(SH004) for SH003
    in (采购课,工程一部,工程二部)) b 
    )SELECT MIN(SH001) SH001,SH002
    ,[采购课]=STUFF((SELECT ','+采购课 FROM CTE WHERE SH002=c.SH002 FOR XML PATH('')), 1, 1, '')
    ,MAX(工程一部) [工程一部]
    ,MAX(工程二部) [工程二部]
    FROM CTE c
    GROUP BY SH002
    /*
    SH001 SH002 采购课 工程一部 工程二部
    2 C-20090012 047-200504
    1 C-20090013 414-200905,222-200301
    9 C-20090014 222-200301
    5 C-20090015 427-200303 981-200801
    3 C-20090016 427-200303
    */
    */
      

  4.   

    哈哈,不好意思,最后的那个SH001是自增列,只是最后一个我忘记改了!实在不好意思!
    with CTE as (
    Select SH001,SH002,ISNULL(采购课,'') 采购课,ISNULL(工程一部,'') 工程一部,ISNULL(工程二部,'') 工程二部
    from (Select SH001,SH002,SH003,SH004 from #A ) a pivot (max(SH004) for SH003
    in (采购课,工程一部,工程二部)) b 
    )
    这个是哪个版本的呢?我现在用的是SQL Server 2000,似乎不支持啊还有一个就是部门可能会有很多,大概有十五个左右,可以让结果只显示列出来的部门吗?比如示例数据中没有研发部,就可以不显示出来
      

  5.   

    建议楼主看看数据行列转换和合并拆分案例;CSDN中此案例非常多。
    行列转换
    合并拆分
      

  6.   

    可以,在select XXX from ,XXX中按需输入。借用8楼脚本
    SELECT SH001,SH002,
           MAX(CASE SH003 WHEN '采购课'  THEN  ISNULL(SH004,'') ELSE '' END)   AS 采购课,
           MAX(CASE SH003 WHEN '工程一部' THEN ISNULL(SH004,'') ELSE '' END)   AS 工程一部,
           MAX(CASE SH003 WHEN '研发部' THEN ISNULL(SH004,'') ELSE '' END)   AS 研发部  
    不要研发部可以删掉此行。
      

  7.   

    要这样删除的话,就太不灵活了啊,示例基本上都是针对2005的
    非常感谢claro