当前位置: 代码迷 >> Sql Server >> 请问一个统计查询如何写
  详细解决方案

请问一个统计查询如何写

热度:23   发布时间:2016-04-24 09:58:29.0
请教一个统计查询怎么写
各位大侠好!
想对不同类别的考生进行编场(每30人一场),考生库ksk中字段有:考生号ksh,姓名xm,性别xb,科类代码kldm,专业代码zydm,要查询以下结果:每一科类的总人数zrs,考场数kcs,尾场人数wcrs,各有多少?其中41~44合编,45~48合编,51~58合编,这些合编的各只有一个尾场。
要求11~18类的显示为:
kldm   zrs   kcs  wcrs
11   39     2       9
12   53     2      23
13   901   31    1
14   33     2       3
15   143   5      23
16   26     1      26 
17   69     3       9
18   913   31    13
而41~44、45~48、51~58的统计人数(其中某一类可能没人如42等):
kldm   zrs  
41  72    
43  9
45  35
51  9
52  22
53  5
55  50
57  1
58  1
要求显示为:
kldm   zrs   kcs  wcrs
41-44   81    3    21
45-48   35    2    5 
51-58   88    3    28 
  
请教这个查询怎么写?
------解决思路----------------------
参考一下
--模拟数据表
IF OBJECT_ID('TempDB..#TB',N'U') IS NOT NULL
DROP TABLE #TB
GO
--模拟考场人数表
CREATE TABLE TempDB..#TB(
kldm INT
,zrs INT
)
GO
INSERT INTO #TB
SELECT 11,39
UNION ALL
SELECT 12,53
UNION ALL
SELECT 13,901
UNION ALL
SELECT 14,33
UNION ALL
SELECT 15,143
UNION ALL
SELECT 16,26
UNION ALL
SELECT 17,69
UNION ALL
SELECT 18,913
UNION ALL
SELECT 41,72
UNION ALL
SELECT 43,9
UNION ALL
SELECT 45,35
UNION ALL
SELECT 51,9
UNION ALL
SELECT 52,22
UNION ALL
SELECT 53,5
UNION ALL
SELECT 55,50
UNION ALL
SELECT 57,1
UNION ALL
SELECT 58,1
GO

-----------模拟合编表------------
IF OBJECT_ID('TempDB..#HeBianTB',N'U') IS NOT NULL
DROP TABLE #HeBianTB
GO
CREATE TABLE TempDB..#HeBianTB(
kldmStart INT
,kldmEnd INT
)
GO
INSERT INTO #HeBianTB
SELECT 41,44
UNION ALL
SELECT 45,48
UNION ALL
SELECT 51,58
GO
-----------模拟合编表------------
--如果你有其它的合编可以往模拟合编表中加
--如果你没有合编情况的信息表,则需要使用CTE临时表处理


--查询开始
SELECT
CAST(kldm AS VARCHAR)kldm
,zrs
,(zrs-1)/30+1 kcs
,zrs%30 wcrs
FROM
#TB A
LEFT JOIN #HeBianTB B ON A.kldm>=B.kldmStart AND A.kldm<=B.kldmEnd
WHERE
B.kldmStart IS NULL
UNION ALL
SELECT
CAST(kldmStart AS VARCHAR)+'-'+CAST(kldmEnd AS VARCHAR)
,SUM(zrs)zrs
,(SUM(zrs)-1)/30+1
,SUM(zrs)%30
FROM
#HeBianTB A
LEFT JOIN #TB B ON B.kldm>=A.kldmStart AND B.kldm<=A.kldmEnd
GROUP BY
A.kldmStart
,A.kldmEnd
--查询结束

/*
11 39 2 9
12 53 2 23
13 901 31 1
14 33 2 3
15 143 5 23
16 26 1 26
17 69 3 9
18 913 31 13
41-44 81 3 21
45-48 35 2 5
51-58 88 3 28
*/
------解决思路----------------------
IF OBJECT_ID('tb') IS NOT NULL
    DROP TABLE tb

GO
create table tb(col1 varchar(10),col2 varchar(10))
INSERT INTO tb
SELECT 11,39
UNION ALL
SELECT 12,53
UNION ALL
SELECT 13,901
UNION ALL
SELECT 14,33
UNION ALL
SELECT 15,143
UNION ALL
SELECT 16,26
UNION ALL
SELECT 17,69
UNION ALL
SELECT 18,913
UNION ALL
SELECT 41,72
UNION ALL
SELECT 43,9
UNION ALL
SELECT 45,35
UNION ALL
SELECT 51,9
UNION ALL
SELECT 52,22
UNION ALL
SELECT 53,5
UNION ALL
SELECT 55,50
UNION ALL
SELECT 57,1
UNION ALL
SELECT 58,1
GO

select * ,t.zrs/30+1 as kcs  ,t.zrs%30 as wcrs
from
(
select   distinct case when col1>=11 and col1 <=18 then col1 
             when col1>=41 and col1<44 then  '41-44'  
             when col1>=45 and col1 <=48 then '45-48'
             when col1>=51 and col1 <=58 then '51-58'  
else null end as kldm   ,  case when col1>=11 and col1 <=18 then col2
  相关解决方案