/**/ /*问题:源表: ID 操作一 操作二 地点 1 张三 张三 1号地点 2 张三 李四 1号地点 3 李四 王五 2号地点 4 张三 王五 1号地点 5 王五 李四 2号地点 6 李四 张三 1号地点 需要得出下表: 姓名 1号地点操作一数量 |1号地点操作二数量 |2号地点操作一数量 |2号地点操作二数量 张三 3 2 0 0 李四 1 1 1 1 王五 0 1 1 1 */ /**/ /*表结构:CREATE TABLE [op] ( [id] [char] (2) COLLATE Chinese_PRC_CI_AS NOT NULL , [op1] [char] (10) COLLATE Chinese_PRC_CI_AS NULL , [op2] [char] (10) COLLATE Chinese_PRC_CI_AS NULL , [addr] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]GO插入数据:INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('1 ','张三 ','张三 ','1号地点 ')INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('2 ','张三 ','李四 ','1号地点 ')INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('3 ','李四 ','王五 ','2号地点 ')INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('4 ','张三 ','王五 ','1号地点 ')INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('5 ','王五 ','李四 ','2号地点 ')INSERT INTO [op] ([id],[op1],[op2],[addr]) values ('6 ','李四 ','张三 ','1号地点 ')*/ select o.names as 姓名, count ( case when op1 = o.names and addr = ' 1号地点 ' then op.op1 end ) as ' 1号地点操作一数量 ' , count ( case when op2 = o.names and addr = ' 1号地点 ' then op.op2 end ) as ' 1号地点操作二数量 ' , count ( case when op1 = o.names and addr = ' 2号地点 ' then op.op1 end ) as ' 2号地点操作一数量 ' , count ( case when op2 = o.names and addr = ' 2号地点 ' then op.op2 end ) as ' 2号地点操作二数量 ' from ( select distinct op1 as names from -- 这个语句是提取操作一与操作二里出现的全部人员并且没有重复 ( select distinct op1 from op where op1 != '' union all select distinct op2 from op where op2 != '' ) as w) as o,op group by o.names