统计单位,性别,数量,箱数的复杂查询问题!!
一个比较复杂的查询,请高手指点:入下表
单位 姓名 性别 型号 数量 箱号 A 张 男 A 2 1 A 王 女 B 2 1 A 刘 男 A 2 2 B 李 男 A 2 3 B 赵 女 C 2 4 要得到的查询结果如下: 单位 男数量 女数量 总数量 箱号范围 A 4 2 6 1-2 B 2 2 4 3-4
select 单位,sum(case when 性别='男' then 数量 else 0 end) [男数量], sum(case when 性别='女' then 数量 else 0 end) [女数量], sum(数量) [总数量],ltrim(min(箱号))+'-'+ltrim(max(箱号)) [箱号范围]from 表group by 单位
[解决办法]
select 单位,sum(case when 性别='男' then 数量 else 0 end) [男数量], sum(case when 性别='女' then 数量 else 0 end) [女数量], sum(数量) [总数量],cast((min(箱号) as varchar(10))+'-'+cast((max(箱号)as varchar(10))+ [箱号范围]from 表名group by 单位
[解决办法]
create table da(单位 char(1), 姓名 varchar(10), 性别 char(2), 型号 char(1), 数量 int, 箱号 int)insert into daselect 'A', '张', '男', 'A', 2, 1 union allselect 'A', '王', '女', 'B', 2, 1 union allselect 'A', '刘', '男', 'A', 2, 2 union allselect 'B', '李', '男', 'A', 2, 3 union allselect 'B', '赵', '女', 'C', 2, 4select 单位,sum(case when 性别='男' then 1 else 0 end) '男数量',sum(case when 性别='女' then 1 else 0 end) '女数量',count(1) '总数量',rtrim(min(箱号))+'-'+rtrim(max(箱号)) '箱号范围'from da group by 单位/*单位 男数量 女数量 总数量 箱号范围---- ----------- ----------- ----------- -------------------------A 2 1 3 1-2B 1 1 2 3-4(2 row(s) affected)*/
[解决办法]
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GOCREATE TABLE [tb]([单位] VARCHAR(1),[姓名] VARCHAR(2),[性别] VARCHAR(2),[型号] VARCHAR(1),[数量] INT,[箱号] INT)INSERT [tb]SELECT 'A','张','男','A',2,1 UNION ALLSELECT 'A','王','女','B',2,1 UNION ALLSELECT 'A','刘','男','A',2,2 UNION ALLSELECT 'B','李','男','A',2,3 UNION ALLSELECT 'B','赵','女','C',2,4GO--> 测试语句:SELECT [单位],sum(case when [性别]='男' then 1 else 0 end) * [数量] as [男数量],sum(case when [性别]='女' then 1 else 0 end) * [数量] as [女数量],count(*)*[数量] as [总数量],ltrim(min([箱号]))+'-'+ltrim(max([箱号])) as [箱号范围]FROM [tb]group by [单位],[数量]/*单位 男数量 女数量 总数量 箱号范围---- ----------- ----------- ----------- -------------------------A 4 2 6 1-2B 2 2 4 3-4(2 行受影响)*/
[解决办法]
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GOCREATE TABLE [tb]([单位] VARCHAR(1),[姓名] VARCHAR(2),[性别] VARCHAR(2),[型号] VARCHAR(1),[数量] INT,[箱号] INT)INSERT [tb]SELECT 'A','张','男','A',2,1 UNION ALLSELECT 'A','王','女','B',3,1 UNION ALLSELECT 'A','刘','男','A',2,2 UNION ALLSELECT 'B','李','男','A',2,3 UNION ALLSELECT 'B','赵','女','C',2,4GO--> 测试语句:select [单位],sum([男数量]) as [男数量],sum([女数量]) as [女数量],sum([男数量])+sum([女数量])as [总数量],ltrim(min([箱号]))+'-'+ltrim(max([箱号])) as[箱号范围]from(SELECT [单位],case when [性别]='男' then 1 else 0 end * [数量] as [男数量],case when [性别]='女' then 1 else 0 end * [数量] as [女数量],[数量],[箱号]FROM [tb]--group by [单位],[数量]) tgroup by [单位]/*单位 男数量 女数量 总数量 箱号范围---- ----------- ----------- ----------- -------------------------A 4 2 6 1-2B 2 2 4 3-4(2 行受影响)*/
[解决办法]
---典型的行转列select 单位,sum(case when 性别='男' then 数量 else 0 end) [男数量], sum(case when 性别='女' then 数量 else 0 end) [女数量], sum(数量) [总数量],ltrim(min(箱号))+'-'+ltrim(max(箱号)) [箱号范围]from 表group by 单位