表A
id 姓名 类别 单位
1 张三 A 单位一
2 张三 B 单位三
3 张三 C 单位一
4 李四 A 单位二
5 李四 C 单位二
6 王五 c 单位三
7 王五 B 单位四想得到的结果是:
姓名 单位    A   B   C
张三 单位三  有   有  有
李四 单位二  有   无  有
王五 单位四  无   有  有即:按姓名分组,如果类别有B则单位就取类别B对应的单位,否则取id值最大的单位,其中类别数量固定,只有A、B、C三类。怎样用一个语句实现?

解决方案 »

  1.   


    declare @表A table
    (
    id int identity(1,1),
    姓名 varchar(10),
    类别 char(1),
    单位 varchar(10)
    )
    insert @表A select '张三','A','单位一'
    union all  select '张三','B','单位三'
    union all  select '张三','C','单位一'
    union all  select '李四','A','单位二'
    union all  select '李四','C','单位二'
    union all  select '王五','C','单位三'
    union all  select '王五','B','单位四'
    select
    a.姓名,
    a.单位,
    A = case when exists(
    select *
    from @表A
                where 姓名 = a.姓名
    and 类别 = 'A') then '有' else '无' end,
    B = case when exists(
    select *
    from @表A
                where 姓名 = a.姓名
    and 类别 = 'B') then '有' else '无' end,
    C = case when exists(
    select *
    from @表A
                where 姓名 = a.姓名
    and 类别 = 'C') then '有' else '无' end
    from @表A a
    where not exists(
    select *
    from @表A
    where 姓名 = a.姓名
    and id > a.id)
      

  2.   


    select  姓名
    ,[单位]=isnull((select 单位 from 表A where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from 表A where 姓名=t.姓名 order by id desc))
    ,[A]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='A') then '有' else '无' end
    ,[B]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='B') then '有' else '无' end
    ,[C]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='C') then '有' else '无' endfrom 表A t
      

  3.   


    create table 表A(id int,姓名 nvarchar(256),类别 nvarchar(100),单位 varchar(10)
    )
    insert 表A select 1,'张三','A','单位一'
    union all  select 2,'张三','B','单位三'
    union all  select 3,'张三','C','单位一'
    union all  select 4,'李四','A','单位二'
    union all  select 5,'李四','C','单位二'
    union all  select 6,'王五','C','单位三'
    union all  select 7,'王五','B','单位四'
    select  distinct 姓名
    ,[单位]=isnull((select 单位 from 表A where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from 表A where 姓名=t.姓名 order by id desc))
    ,[A]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='A') then '有' else '无' end
    ,[B]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='B') then '有' else '无' end
    ,[C]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='C') then '有' else '无' endfrom 表A tdrop table 表A
      

  4.   

    set nocount on
    declare @t table(id int, 姓名 varchar(10), 类别 varchar(10), 单位 varchar(10)) 
    insert @t select 1, '张三', 'A', '单位一' 
    insert @t select 2, '张三', 'B', '单位三' 
    insert @t select 3, '张三', 'C', '单位一' 
    insert @t select 4, '李四', 'A', '单位二' 
    insert @t select 5, '李四', 'C', '单位二' 
    insert @t select 6, '王五', 'c', '单位三' 
    insert @t select 7, '王五', 'B', '单位四'
    select  distinct 姓名
            ,[单位]=isnull((select 单位 from @t where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from @t where 姓名=t.姓名 order by id desc))
            ,[A]= case when exists (select 1 from @t where 姓名=t.姓名 and 类别='A') then '有' else '无' end
            ,[B]= case when exists (select 1 from @t where 姓名=t.姓名 and 类别='B') then '有' else '无' end
            ,[C]= case when exists (select 1 from @t where 姓名=t.姓名 and 类别='C') then '有' else '无' endfrom @t t
    /*
    姓名         单位         A    B    C    
    ---------- ---------- ---- ---- ---- 
    李四         单位二        有    无    有
    王五         单位四        无    有    有
    张三         单位三        有    有    有
    */
      

  5.   


    create table 表A(id int,姓名 nvarchar(256),类别 nvarchar(100),单位 nvarchar(100))
    insert 表A select 1,'张三','A','单位一'
    union all  select 2,'张三','B','单位三'
    union all  select 3,'张三','C','单位一'
    union all  select 4,'李四','A','单位二'
    union all  select 5,'李四','C','单位二'
    union all  select 6,'王五','C','单位三'
    union all  select 7,'王五','B','单位四'
    goselect  distinct 姓名
    ,[单位]=isnull((select 单位 from 表A where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from 表A where 姓名=t.姓名 order by id desc))
    ,[A]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='A') then '有' else '无' end
    ,[B]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='B') then '有' else '无' end
    ,[C]= case when exists (select 1 from 表A where 姓名=t.姓名 and 类别='C') then '有' else '无' endfrom 表A t
    /*
    ---------------
    李四 单位二 有 无 有
    王五 单位四 无 有 有
    张三 单位三 有 有 有
    */drop table 表A
      

  6.   


    declare @表A table
    (
    id int identity(1,1),
    姓名 varchar(10),
    类别 char(1),
    单位 varchar(10)
    )
    insert @表A select '张三','A','单位一'
    union all  select '张三','B','单位三'
    union all  select '张三','C','单位一'
    union all  select '李四','A','单位二'
    union all  select '李四','C','单位二'
    union all  select '王五','C','单位三'
    union all  select '王五','B','单位四'select
      a.姓名,
      单位 = 
    case when exists(
    select * 
    from @表A
    where 姓名 = a.姓名
    and 类别 = 'B'
    )
    then (
    select top 1 单位
    from @表A
    where 姓名 = a.姓名
    and 类别 = 'B'
    )
    else(
    select top 1 单位
    from @表A b
    where b.姓名 = a.姓名
    and not exists(
    select * 
    from @表A
    where id > b.id
    and 姓名 = b.姓名)

    end,
    A = case when exists(
                select *
                from @表A
                where 姓名 = a.姓名
                    and 类别 = 'A') then '有' else '无' end,
        B = case when exists(
                select *
                from @表A
                where 姓名 = a.姓名
                    and 类别 = 'B') then '有' else '无' end,
        C = case when exists(
                select *
                from @表A
                where 姓名 = a.姓名
                    and 类别 = 'C') then '有' else '无' end
    from @表A a
    group by a.姓名/**
    李四 单位二 有 无 有
    王五 单位四 无 有 有
    张三 单位三 有 有 有
    **/
      

  7.   


    create table 表A(id int,姓名 nvarchar(256),类别 nvarchar(100),单位 nvarchar(100))
    insert 表A select 1,'张三','A','单位一'
    union all  select 2,'张三','B','单位三'
    union all  select 3,'张三','C','单位一'
    union all  select 4,'李四','A','单位二'
    union all  select 5,'李四','C','单位二'
    union all  select 6,'王五','C','单位三'
    union all  select 7,'王五','B','单位四'
    goselect  姓名
            ,[单位]=isnull((select 单位 from 表A where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from 表A where 姓名=t.姓名 order by id desc))
    ,[A]=case max(case 类别 when 'A' then 1 else 0 end) when 1 then '有' else '无' end
    ,[B]=case max(case 类别 when 'B' then 1 else 0 end) when 1 then '有' else '无' end
    ,[C]=case max(case 类别 when 'C' then 1 else 0 end) when 1 then '有' else '无' end
    from 表A t
    group by 姓名
    /*
    ---------------
    李四 单位二 有 无 有
    王五 单位四 无 有 有
    张三 单位三 有 有 有
    */drop table 表A
      

  8.   

    --> liangCK小梁 于2008-10-15
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (id INT,姓名 VARCHAR(4),类别 VARCHAR(1),单位 VARCHAR(6))
    INSERT INTO #T
    SELECT 1,'张三','A','单位一' UNION ALL
    SELECT 2,'张三','B','单位三' UNION ALL
    SELECT 3,'张三','C','单位一' UNION ALL
    SELECT 4,'李四','A','单位二' UNION ALL
    SELECT 5,'李四','C','单位二' UNION ALL
    SELECT 6,'王五','c','单位三' UNION ALL
    SELECT 7,'王五','B','单位四'--SQL查询如下:SELECT 姓名,
           ISNULL(单位,(SELECT TOP 1 单位
                        FROM #T 
                        WHERE 姓名=t.姓名
                        ORDER BY id DESC)),
           A,B,C
    FROM
    (
      SELECT 姓名,
           MAX(CASE WHEN 类别='B' THEN 单位 END) 单位,
           MAX(CASE WHEN 类别='A' THEN '有' ELSE '无' END) A,
           MAX(CASE WHEN 类别='B' THEN '有' ELSE '无' END) B,
           MAX(CASE WHEN 类别='C' THEN '有' ELSE '无' END) C
      FROM #T
      GROUP BY 姓名
    ) AS t/*
    姓名          A    B    C
    ---- ------ ---- ---- ----
    李四   单位二    有    无    有
    王五   单位四    无    有    有
    张三   单位三    有    有    有(3 行受影响)*/
      

  9.   

    --> liangCK小梁 于2008-10-15
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (id INT,姓名 VARCHAR(4),类别 VARCHAR(1),单位 VARCHAR(6))
    INSERT INTO #T
    SELECT 1,'张三','A','单位一' UNION ALL
    SELECT 2,'张三','B','单位三' UNION ALL
    SELECT 3,'张三','C','单位一' UNION ALL
    SELECT 4,'李四','A','单位二' UNION ALL
    SELECT 5,'李四','C','单位二' UNION ALL
    SELECT 6,'王五','c','单位三' UNION ALL
    SELECT 7,'王五','B','单位四'--SQL查询如下:SELECT 姓名,
           ISNULL(单位,(SELECT TOP 1 单位
                        FROM #T 
                        WHERE 姓名=t.姓名
                        ORDER BY id DESC)),
           A,B,C
    FROM
    (
      SELECT 姓名,
           MAX(CASE WHEN 类别='B' THEN 单位 END) 单位,
           MAX(CASE WHEN 类别='A' THEN '有' ELSE '无' END) A,
           MAX(CASE WHEN 类别='B' THEN '有' ELSE '无' END) B,
           MAX(CASE WHEN 类别='C' THEN '有' ELSE '无' END) C
      FROM #T
      GROUP BY 姓名
    ) AS t/*
    姓名          A    B    C
    ---- ------ ---- ---- ----
    李四   单位二    有    无    有
    王五   单位四    无    有    有
    张三   单位三    有    有    有(3 行受影响)*/
      

  10.   


    create table 表A(id int,姓名 nvarchar(256),类别 nvarchar(100),单位 nvarchar(100))
    insert 表A select 1,'张三','A','单位一'
    union all  select 2,'张三','B','单位三'
    union all  select 3,'张三','C','单位一'
    union all  select 4,'李四','A','单位二'
    union all  select 5,'李四','C','单位二'
    union all  select 6,'王五','C','单位三'
    union all  select 7,'王五','B','单位四'
    goselect  姓名
            ,[单位]=isnull((select 单位 from 表A where 姓名=t.姓名 and 类别='B'),(select top 1 单位 from 表A where 姓名=t.姓名 order by id desc))
    ,[A]=case max(case 类别 when 'A' then 1 else 0 end) when 1 then '有' else '无' end
    ,[B]=case max(case 类别 when 'B' then 1 else 0 end) when 1 then '有' else '无' end
    ,[C]=case max(case 类别 when 'C' then 1 else 0 end) when 1 then '有' else '无' end
    from 表A t
    group by 姓名
    /*
    ---------------
    李四 单位二 有 无 有
    王五 单位四 无 有 有
    张三 单位三 有 有 有
    */drop table 表A
      

  11.   

    csdn碰到两个发文时间相同的情况会抛黄页?
      

  12.   


    declare @a table
    (
        id int identity(1,1),
        NAME varchar(10),
        Class char(1),
        Unit Nvarchar(10)
    )
    insert @a select '张三','A', '单位一'
    union all  select '张三','B','单位三'
    union all  select '张三','C','单位一'
    union all  select '李四','A','单位二'
    union all  select '李四','C','单位二'
    union all  select '王五','C','单位三'
    union all  select '王五','B','单位四'  
    SELECT NAME, 
    Unit=MAX(Unit),
    A=MAX(CASE WHEN b.Class IS NULL THEN '无' ELSE '有' END),
    B=MAX(CASE WHEN c.Class IS NULL THEN '无' ELSE '有' END),
    B=MAX(CASE WHEN d.Class IS NULL THEN '无' ELSE '有' END)
    FROM @a a
    LEFT JOIN (SELECT DISTINCT Class FROM @a) b 
    ON a.Class=b.Class AND a.Class='A'
    LEFT JOIN (SELECT DISTINCT Class FROM @a) c 
    ON a.Class=c.Class AND a.Class='B'
    LEFT JOIN (SELECT DISTINCT Class FROM @a) d 
    ON a.Class=d.Class AND a.Class='C'
    GROUP BY NAME
     
      

  13.   

    --> 测试数据: @A
    declare @A table (id int,姓名 varchar(4),类别 varchar(1),单位 varchar(6))
    insert into @A
    select 1,'张三','A','单位一' union all
    select 2,'张三','B','单位三' union all
    select 3,'张三','C','单位一' union all
    select 4,'李四','A','单位二' union all
    select 5,'李四','C','单位二' union all
    select 6,'王五','c','单位三' union all
    select 7,'王五','B','单位四'
    select 姓名,单位=(select top 1 单位 from @a where 姓名=a.姓名 order by id desc),
    A=max(case 类别 when 'A' then '有' else '无' end),
    B=max(case 类别 when 'B' then '有' else '无' end),
    C=max(case 类别 when 'C' then '有' else '无' end)
     from @A a
    group by 姓名
    --结果:姓名   单位     A    B    C    
    ---- ------ ---- ---- ---- 
    李四   单位二    有    无    有
    王五   单位四    无    有    有
    张三   单位一    有    有    有
      

  14.   

    --> --> (Andy)生成测试数据 2008-10-15
    Set Nocount On
    declare @1 table([id] int,[姓名] nvarchar(2),[类别] nvarchar(1),[单位] nvarchar(3))
    Insert @1
    select 1,N'张三',N'A',N'单位一' union all
    select 2,N'张三',N'B',N'单位三' union all
    select 3,N'张三',N'C',N'单位一' union all
    select 4,N'李四',N'A',N'单位二' union all
    select 5,N'李四',N'C',N'单位二' union all
    select 6,N'王五',N'c',N'单位三' union all
    select 7,N'王五',N'B',N'单位四';With t As
    (
    Select [id],[姓名],[单位] From @1 a Where ([类别]=N'B' And id=(Select Max(id) From @1 Where [姓名]=a.[姓名] And [类别]=a.[类别]))or
    (Not Exists(Select 1 From @1 Where [姓名]=a.[姓名] And [类别]=N'B') And id=(Select Max(id) From @1 Where [姓名]=a.[姓名])) 
    )Select [姓名],[单位],
    Case A When 1 Then N'有' Else N'无' End As A,
    Case B When 1 Then N'有' Else N'无' End As B,
    Case C When 1 Then N'有' Else N'无' End As C
    From (Select x.[姓名],x.[类别],t.[单位] 
    From @1 x Inner Join t On t.[姓名]=x.[姓名] ) a
    Pivot(Count([类别]) For [类别] In([A],[B],[C])) b
    Order By b.[单位] 
    /*
    姓名   单位   A    B    C
    ---- ---- ---- ---- ----
    李四   单位二  有    无    有
    张三   单位三  有    有    有
    王五   单位四  无    有    有*/