本帖最后由 ptwhite 于 2010-09-30 09:33:56 编辑

解决方案 »

  1.   

    DECLARE @a TABLE(数量 int, 类型 int,组织 varchar(20), 员工 varchar(20),组长 varchar(20))insert @a select 1, 2 ,'第一营业处4组', '周芳琴', '胡文英' 
    union all select 2, 3 ,'第一营业处4组', '李静', '胡文英' 
    union all select 1, 2 ,'第一营业处4组', '李家柳', '李枝欣'
    union all select 1, 1 ,'第一营业处4组', '胡冬青', '李枝欣' 
    union all select 1, 1 ,'第一营业处4组', '赵薇', '李枝欣'
    union all select 2, 0 ,'第一营业处4组', '赵薇', '李枝欣' 
    union all select 3, 0 ,'第一营业处4组', '赵薇', '李枝欣' 
    union all select 1, 0 ,'第一营业处4组', '叶利亮','胡文英' 
    union all select 2, 0 ,'第一营业处4组', '黄艳虹','李枝欣'DECLARE @b TABLE(id int identity(1,1),组织 varchar(20),组长 varchar(20),员工 varchar(20),类型 int,数量 INT)INSERT @b 
    SELECT 组织,组长,员工,类型,数量 FROM (
    SELECT 数量,x 类型,组织,a.员工,a.组长 FROM (SELECT distinct 员工,组长 from @a) a cross JOIN (SELECT 1 x UNION SELECT 2 UNION SELECT 3) b
    LEFT JOIN @a c ON a.员工=c.员工 and b.x=c.类型        
    UNION ALL 
    SELECT distinct SUM(数量),0,组织,null,组长 from @a where 类型>0  group by  组织,组长)aaaa
    order by 组长,员工SELECT 组织=case when id=(select TOP 1 id from @b where 组织=a.组织) then 组织 else '' end, 组长=case when id=(select TOP 1 id from @b where 组长=a.组长) then 组长 else '' end,
    员工=case when id=(select TOP 1 id from @b where 员工=a.员工) then 员工 else '' end,
    类型,
    数量=ltrim(isnull(数量,''))+''
    FROM @b a
      

  2.   

    --result
    /*
    组织                   组长                   员工                   类型          数量           
    -------------------- -------------------- -------------------- ----------- ------------ 
    第一营业处4组              胡文英                                       0           3
                                              李静                   1           0
                                                                   2           0
                                                                   3           2
                                              叶利亮                  1           0
                                                                   2           0
                                                                   3           0
                                              周芳琴                  1           0
                                                                   2           1
                                                                   3           0
                         李枝欣                                       0           3
                                              胡冬青                  1           1
                                                                   2           0
                                                                   3           0
                                              黄艳虹                  1           0
                                                                   2           0
                                                                   3           0
                                              李家柳                  1           0
                                                                   2           1
                                                                   3           0
                                              赵薇                   1           1
                                                                   2           0
                                                                   3           0(所影响的行数为 23 行)*/
      

  3.   


    use PracticeDB
    go
    if exists(select 1 from sysobjects where name='tb')
    drop table tb
    go
    create table tb( 数量 int, 类型 int, 组织 varchar(20),员工 varchar(10), 小组长 varchar(10))
    insert into tb
    select 1, 2, '第一营业处4组', '周芳琴', '胡文英 ' union all
    select 2, 3, '第一营业处4组', '李静', '胡文英'  union all
    select 1, 2, '第一营业处4组', '李家柳', '李枝欣'  union all
    select 1, 1, '第一营业处4组', '胡冬青', '李枝欣'  union all
    select 1, 1, '第一营业处4组', '赵薇', '李枝欣' union all
    select 2, 0, '第一营业处4组', '赵薇','李枝欣'  union all
    select 3, 0, '第一营业处4组', '赵薇', '李枝欣' union all
    select 1, 0, '第一营业处4组', '叶利亮', '胡文英'  union all
    select 2, 0, '第一营业处4组', '黄艳虹', '李枝欣'
    ;with t
    as
    (
    select distinct * 
    from (select 组织, 小组长 as 组长,员工
      from tb
      where 小组长='李枝欣') a  cross join (select distinct 类型 from tb) b
    )
    select t.*,ISNULL(sum(tb.数量),0) 数量
    from t left join tb on t.组织=tb.组织 and t.组长=tb.小组长 and t.员工=tb.员工 and t.类型=tb.类型
    group by t.组织,t.组长,t.员工,t.类型
    组织 组长 员工 类型 数量
    第一营业处4组 李枝欣 胡冬青 0 0
    第一营业处4组 李枝欣 胡冬青 1 1
    第一营业处4组 李枝欣 胡冬青 2 0
    第一营业处4组 李枝欣 胡冬青 3 0
    第一营业处4组 李枝欣 黄艳虹 0 2
    第一营业处4组 李枝欣 黄艳虹 1 0
    第一营业处4组 李枝欣 黄艳虹 2 0
    第一营业处4组 李枝欣 黄艳虹 3 0
    第一营业处4组 李枝欣 李家柳 0 0
    第一营业处4组 李枝欣 李家柳 1 0
    第一营业处4组 李枝欣 李家柳 2 1
    第一营业处4组 李枝欣 李家柳 3 0
    第一营业处4组 李枝欣 赵薇 0 5
    第一营业处4组 李枝欣 赵薇 1 1
    第一营业处4组 李枝欣 赵薇 2 0
    第一营业处4组 李枝欣 赵薇 3 0
    我再看看怎么显示成楼主要求的那样哈
      

  4.   

    DECLARE @a TABLE(数量 int, 类型 int,组织 varchar(20), 员工 varchar(20),组长 varchar(20))insert @a select 1, 2 ,'第一营业处4组', '周芳琴', '胡文英' 
    union all select 2, 3 ,'第一营业处4组', '李静', '胡文英' 
    union all select 1, 2 ,'第一营业处4组', '李家柳', '李枝欣'
    union all select 1, 1 ,'第一营业处4组', '胡冬青', '李枝欣' 
    union all select 1, 1 ,'第一营业处4组', '赵薇', '李枝欣'
    union all select 2, 0 ,'第一营业处4组', '赵薇', '李枝欣' 
    union all select 3, 0 ,'第一营业处4组', '赵薇', '李枝欣' 
    union all select 1, 0 ,'第一营业处4组', '叶利亮','胡文英' 
    union all select 2, 0 ,'第一营业处4组', '黄艳虹','李枝欣'DECLARE @b TABLE(id int identity(1,1),组织 varchar(20),组长 varchar(20),员工 varchar(20),类型 int,数量 INT)
    DECLARE @c TABLE(id int ,组织 varchar(20),组长 varchar(20),员工 varchar(20),类型 int,数量 INT)INSERT @b(组织,组长,员工,类型,数量)
    SELECT 组织,组长,员工,类型,sum(数量) FROM (
    SELECT 数量,b.类型,组织,a.员工,a.组长 FROM (SELECT distinct 员工,组长 from @a) a cross JOIN (select distinct 类型  from @a) b
    LEFT JOIN @a c ON a.员工=c.员工 and b.类型=c.类型)aaaa
    group by  组织,组长,员工,类型
    order by 组长,员工,类型insert @c
    SELECT id,组织=case when id=(select TOP 1 id from @b where 员工=a.员工) then (select top 1 组织 from @a where 员工=a.员工) else null end ,组长,员工,类型,数量 FROM @b aSELECT  组织=case when id=(select TOP 1 id from @c where 组织=a.组织) then 组织 else '' end,
    组长=case when id=(select TOP 1 id from @c where 组长=a.组长) then 组长 else '' end,
    员工=case when id=(select TOP 1 id from @c where 员工=a.员工) then 员工 else '' end,
    类型,
    数量=ltrim(isnull(数量,''))+''
    FROM @c a
    --result
    /*组织                   组长                   员工                   类型          数量           
    -------------------- -------------------- -------------------- ----------- ------------ 
    第一营业处4组              胡文英                  李静                   0           0
                                                                   1           0
                                                                   2           0
                                                                   3           2
                                              叶利亮                  0           1
                                                                   1           0
                                                                   2           0
                                                                   3           0
                                              周芳琴                  0           0
                                                                   1           0
                                                                   2           1
                                                                   3           0
                         李枝欣                  胡冬青                  0           0
                                                                   1           1
                                                                   2           0
                                                                   3           0
                                              黄艳虹                  0           2
                                                                   1           0
                                                                   2           0
                                                                   3           0
                                              李家柳                  0           0
                                                                   1           0
                                                                   2           1
                                                                   3           0
                                              赵薇                   0           5
                                                                   1           1
                                                                   2           0
                                                                   3           0(所影响的行数为 28 行)*/
      

  5.   

    数据是对了
    但是我不能写
    小组长='李枝欣'  这判断吧;with t
    as
    (
    这写法我还没怎么用过,是什么意思呀
      

  6.   


    ;with t
    as
    (
    select distinct * 
    from (select 组织, 小组长 as 组长,员工
      from tb
      where 小组长='李枝欣') a  cross join (select distinct 类型 from tb) b
    ),t1
    as
    (
        select row_number() over(order by t.组织) num,row_number() over(PARTITION by t.员工  order by t.类型) num1,t.组织,t.组长, t.员工,t.类型,isnull(sum(tb.数量),0) 数量
    from t left join tb on t.组织=tb.组织 and t.组长=tb.小组长 and t.员工=tb.员工 and t.类型=tb.类型
    group by t.组织,t.组长,t.员工,t.类型
    )
    select case when (select count(组织)/2+count(组织)%2 from t1 )=num then 组织 else '' end 组织,
           case when (select count(组长)/2+count(组长)%2 from t1 )=num then 组长 else '' end 组长,
           case when num1=2 then 员工 else '' end 员工,类型,数量
           
    from t1 
    group by num,组织,组长,num1,员工,类型,数量组织     组长 员工 类型 数量
    0 0
    胡冬青 1 1
    2 0
    3 0
    0 2
    黄艳虹 1 0
    2 0
    第一营业处4组 李枝欣 3 0
    0 0
    李家柳 1 0
    2 1
    3 0
    0 5
    赵薇 1 1
    2 0
    3 0
      

  7.   


    ;with t
    as
    (
    select distinct * 
    from (select 组织, 小组长 as 组长,员工
      from tb) a  cross join (select distinct 类型 from tb) b
    ),t1
    as
    (
        select row_number() over (order by t.组织) num,row_number() over(PARTITION by t.组长 order by t.员工) num1,
               row_number() over(PARTITION by t.员工  order by t.类型) num2,t.组织,t.组长, t.员工,t.类型,isnull(sum(tb.数量),0) 数量
    from t left join tb on t.组织=tb.组织 and t.组长=tb.小组长 and t.员工=tb.员工 and t.类型=tb.类型
    group by t.组织,t.组长,t.员工,t.类型
    )
    select case when (select count(组织)/2+count(组织)%2 from t1 )=num then 组织 else '' end 组织,
           case when num1 =t2.diff then t1.组长 else '' end 组长,
           case when num2=2 then 员工 else '' end 员工,类型,数量
           
    from t1 join (select 组长,count(组长)/2+count(组长)%2 diff from t1 group by 组长 ) t2 on t1.组长=t2.组长
    group by num,组织,num1,t1.组长,t2.diff,num2,员工,类型,数量组织     组长   员工   类型   数量
    0 0
    李静 1 0
    2 0
    3 2
    0 1
    胡文英    叶利亮 1 0
    2 0
    3 0
    0 0
    周芳琴 1 0
    2 1
    3 0
    0 5
    赵薇 1 1
    2 0
    3 0
    0 0
    第一营业处4组           胡冬青 1 1
    2 0
    3 0
    0 2
    黄艳虹 1 0
    2 0
    李枝欣        3 0
       0 0
    李家柳 1 0
    2 1
    3 0