这个题如果Bok_name为null的列按照 Book_TotalCustomer 、Book_TotalNum 排序就说的更好一些.没有就用临时表:          select id=identity(int,1,1),* int #tmp from test
          select Book_Name=(case when id in (select min(id) from #tmp group by Book_Name)
                             then Book_Name else null end)
            ,Book_Operator  ,Book_TotalCustomer, Book_TotalNum
           from #tmp
           drop table #tmp

解决方案 »

  1.   

    select id=identity(int,1,1),* into #tmp from test
              select Book_Name=(case when id in (select min(id) from #tmp group by Book_Name)
                                 then Book_Name else null end)
                ,Book_Operator  ,Book_TotalCustomer, Book_TotalNum
               from #tmp
               drop table #tmp
    --------------------
    医学心理学 小张 4 23
    NULL 小李 24 35
    NULL 小王 2 34
    工程力学 小张 23 34
    NULL 小李 5 17
    NULL 小王 7 20
      

  2.   

    谢谢降龙,可是我用查询分析器运行时不对啊,我的意思是: 记录代表一次交易,表里可能每本书和每个人多出现很多次,要做一个统计,第一级是书,第二级是业务员,后两个字段要做一个统计,是在第二级中统计的每个业务员的发货客户数和,发货次数:比如原表:
           Book_Name  Book_Operator  Book_Customer  Book_Num
           医学心理学    小张           广东           6
            工程力学     小李           湖南           4
           医学心理学    小李           广东           8
            工程力学     小张           陕西           3
           医学心理学    小李           陕西           4 
           医学心理学    小张           广东           8    (和第一条记录除了发货数都相同
            工程力学     小王           陕西           3
           医学心理学    小刘           广东           8  结果是:
          Book_Name   Book_Operator  Book_TotalCustomer  Book_TotalNum 
          医学心理学     小张               1                 14
            NULL         小李               2                 12
            NULL         小刘               1                 8
          工程力学       小张               1                 3
            NULL         小李               1                 4
            NULL         小王               1                 3
    注意这里有两点:
     1  医学心理学--小张 只发给过一个客户,发了两次,Book_TotalCustomer=1,Book_TotalNum=6+8
     2  医学心理学,工程力学里的小张是同一个人,只是因为分级查询而到了结果的不同记录里
               
      

  3.   

    select Book_Name,Book_Operator
    ,Book_TotalCustomer=count(distinct Book_Customer)
    ,Book_TotalNum=sum(Book_Num)
    from tb
    group by Book_Name,Book_Operator
    order by Book_Name,Book_Operator
      

  4.   

    --测试--测试数据
    create table tb(Book_Name nvarchar(10),Book_Operator nvarchar(10),Book_Customer nvarchar(10),Book_Num int)
    insert tb select N'医学心理学',N'小张',N'广东',6
    union all select N'工程力学'  ,N'小李',N'湖南',4
    union all select N'医学心理学',N'小李',N'广东',8
    union all select N'工程力学'  ,N'小张',N'陕西',3
    union all select N'医学心理学',N'小李',N'陕西',4 
    union all select N'医学心理学',N'小张',N'广东',8
    union all select N'工程力学'  ,N'小王',N'陕西',3
    union all select N'医学心理学',N'小刘',N'广东',8  
    go--查询
    select Book_Name,Book_Operator
    ,Book_TotalCustomer=count(distinct Book_Customer)
    ,Book_TotalNum=sum(Book_Num)
    from tb
    group by Book_Name,Book_Operator
    order by Book_Name,Book_Operator
    go--删除测试
    drop table tb/*--测试结果Book_Name  Book_Operator Book_TotalCustomer Book_TotalNum 
    ---------- ------------- ------------------ ------------- 
    工程力学       小李            1                  4
    工程力学       小王            1                  3
    工程力学       小张            1                  3
    医学心理学      小李            2                  12
    医学心理学      小刘            1                  8
    医学心理学      小张            1                  14(所影响的行数为 6 行)
    --*/
      

  5.   

    --如果Book_Name仅在每组的第一条显示,则改用:select b.Book_Name,a.Book_Operator
    ,Book_TotalCustomer=count(distinct a.Book_Customer)
    ,Book_TotalNum=sum(a.Book_Num)
    from tb a left join(
    select Book_Name,Book_Operator=min(Book_Operator) 
    from tb group by Book_Name
    )b on a.Book_Name=b.Book_Name and a.Book_Operator=b.Book_Operator
    group by a.Book_Name,b.Book_Name,a.Book_Operator
    order by a.Book_Name,a.Book_Operator
    go
      

  6.   

    --测试--测试数据
    create table tb(Book_Name nvarchar(10),Book_Operator nvarchar(10),Book_Customer nvarchar(10),Book_Num int)
    insert tb select N'医学心理学',N'小张',N'广东',6
    union all select N'工程力学'  ,N'小李',N'湖南',4
    union all select N'医学心理学',N'小李',N'广东',8
    union all select N'工程力学'  ,N'小张',N'陕西',3
    union all select N'医学心理学',N'小李',N'陕西',4 
    union all select N'医学心理学',N'小张',N'广东',8
    union all select N'工程力学'  ,N'小王',N'陕西',3
    union all select N'医学心理学',N'小刘',N'广东',8  
    go--查询
    select b.Book_Name,a.Book_Operator
    ,Book_TotalCustomer=count(distinct a.Book_Customer)
    ,Book_TotalNum=sum(a.Book_Num)
    from tb a left join(
    select Book_Name,Book_Operator=min(Book_Operator) 
    from tb group by Book_Name
    )b on a.Book_Name=b.Book_Name and a.Book_Operator=b.Book_Operator
    group by a.Book_Name,b.Book_Name,a.Book_Operator
    order by a.Book_Name,a.Book_Operator
    go--删除测试
    drop table tb/*--测试结果Book_Name  Book_Operator Book_TotalCustomer Book_TotalNum 
    ---------- ------------- ------------------ ------------- 
    工程力学       小李            1                  4
    NULL          小王            1                  3
    NULL          小张            1                  3
    医学心理学     小李            2                  12
    NULL          小刘            1                  8
    NULL          小张            1                  14(所影响的行数为 6 行)
    --*/
      

  7.   

    问题解决了,邹大哥,你就是我的偶像,我一直混迹在图象版,没想到SQL版的斑竹这么牛,厉害
    也谢谢其他几位朋友,马上结帖。