带统计的表的行列转换问题

本文通过一个具体的SQL案例,展示了如何使用SQL进行复杂的数据分组和统计,特别聚焦于根据不同条件进行的操作一和操作二的数量统计,适用于需要对数据进行精细化管理和分析的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
问题:
源表:   
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 endas '1号地点操作一数量',
    
count(case when op2=o.names and addr='1号地点' then op.op2 endas '1号地点操作二数量',
    
count(case when op1=o.names and addr='2号地点' then op.op1 endas '2号地点操作一数量',
    
count(case when op2=o.names and addr='2号地点' then op.op2 endas '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


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值