日期:2014-05-18  浏览次数:20483 次

统计单位,性别,数量,箱数的复杂查询问题!!
一个比较复杂的查询,请高手指点:入下表
SQL code

  单位     姓名   性别   型号    数量    箱号
  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  



该查询其实不考虑姓名和型号的问题,主要是要区分出男数量,女数量的多少,和箱号范围!
请高手指点!!!!

------解决方案--------------------
SQL code

select 单位,sum(case when 性别='男' then 数量 else 0 end) [男数量],
            sum(case when 性别='女' then 数量 else 0 end) [女数量],
       sum(数量) [总数量],ltrim(min(箱号))+'-'+ltrim(max(箱号)) [箱号范围]
from 表
group by 单位

------解决方案--------------------
SQL code

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 单位

------解决方案--------------------
SQL code

create table da
(单位 char(1), 姓名 varchar(10), 性别 char(2), 
型号 char(1), 数量 int, 箱号 int)

insert into da
select 'A', '张', '男', 'A', 2, 1 union all
select 'A', '王', '女', 'B', 2, 1 union all
select 'A', '刘', '男', 'A', 2, 2 union all
select 'B', '李', '男', 'A', 2, 3 union all
select 'B', '赵', '女', 'C', 2, 4


select 单位,
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-2
B      1           1           2           3-4

(2 row(s) affected)
*/

------解决方案--------------------
SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([单位] VARCHAR(1),[姓名] VARCHAR(2),[性别] VARCHAR(2),[型号] VARCHAR(1),[数量] INT,[箱号] INT)
INSERT [tb]
SELECT 'A','张','男','A',2,1 UNION ALL
SELECT 'A','王','女','B',2,1 UNION ALL
SELECT 'A','刘','男','A',2,2 UNION ALL
SELECT 'B','李','男','A',2,3 UNION ALL
SELECT 'B','赵','女','C',2,4
GO

--> 测试语句:
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-2
B    2           2           4           3-4

(2 行受影响)


*/

------解决方案--------------------
SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([单位] VARCHAR(1),[姓名] VARCHAR(2),[性别] VARCHAR(2),[型号] VARCHAR(1),[数量] INT,[箱号] INT)
INSERT [tb]
SELECT 'A','张','男','A',2,1 UNION ALL
SELECT 'A','王','女','B',3,1 UNION ALL
SELECT 'A','刘','男','A',2,2 UNION ALL
SELECT 'B','李','男','A',2,3 UNION ALL
SELECT 'B','赵','女','C',2,4
GO

--> 测试语句:
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 [单位],[数量]
) t
group by [单位]

/*
单位   男数量         女数量         总数量         箱号范围
---- ----------- ----------- ----------- -------------------------
A    4           2           6