表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三类。怎样用一个语句实现?
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)
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
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
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 ---------- ---------- ---- ---- ---- 李四 单位二 有 无 有 王五 单位四 无 有 有 张三 单位三 有 有 有 */
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
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.姓名/** 李四 单位二 有 无 有 王五 单位四 无 有 有 张三 单位三 有 有 有 **/
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
--> 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 行受影响)*/
--> 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 行受影响)*/
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
csdn碰到两个发文时间相同的情况会抛黄页?
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
--> 测试数据: @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 ---- ------ ---- ---- ---- 李四 单位二 有 无 有 王五 单位四 无 有 有 张三 单位一 有 有 有
--> --> (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 ---- ---- ---- ---- ---- 李四 单位二 有 无 有 张三 单位三 有 有 有 王五 单位四 无 有 有*/
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)
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
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
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
---------- ---------- ---- ---- ----
李四 单位二 有 无 有
王五 单位四 无 有 有
张三 单位三 有 有 有
*/
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
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.姓名/**
李四 单位二 有 无 有
王五 单位四 无 有 有
张三 单位三 有 有 有
**/
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
--> 生成测试数据: #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 行受影响)*/
--> 生成测试数据: #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 行受影响)*/
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
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
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
---- ------ ---- ---- ----
李四 单位二 有 无 有
王五 单位四 无 有 有
张三 单位一 有 有 有
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
---- ---- ---- ---- ----
李四 单位二 有 无 有
张三 单位三 有 有 有
王五 单位四 无 有 有*/