求助,关于统计百分比的问题
本帖最后由 lixiaolian7 于 2012-11-15 06:31:22 编辑 结构及数据如下
id market name content option total
101区内市场黑龙江加油站排队情况经常排队21
101区内市场黑龙江加油站排队情况分时段排队142
101区内市场黑龙江加油站排队情况无排队353
101区内市场黑龙江是否限量销售汽柴油均限量46
101区内市场黑龙江是否限量销售只有汽油限量9
101区内市场黑龙江是否限量销售只有柴油限量455
101区内市场黑龙江是否限量销售无限量销售6
101区内市场黑龙江断档情况只有汽油出现断档13
101区内市场黑龙江断档情况只有柴油出现断档17
101区内市场黑龙江断档情况无断档455
101区内市场黑龙江断档情况汽柴油均出现断档31
101区内市场黑龙江脱销情况汽柴油均出现脱销NULL
101区内市场黑龙江脱销情况只有汽油出现脱销2
101区内市场黑龙江脱销情况只有柴油出现脱销513
101区内市场黑龙江脱销情况无脱销1
101区内市场黑龙江加油站是否停业检修否24
101区内市场黑龙江加油站是否停业检修是35
这是一个调查结果的数据表
content字段是调查的问题
option是调查的选项
total是该调查选项的数量
我希望统计出每种调查的选项在该问题下占到的百分之
例如加油站是否停业检修问题有两个选项,是和否。是选项有70个数量否选项有30个数量,那么统计结果就是一个是70%一个是30%。
想了半天没有想到方法
谢谢
补充:
实际上把所有的选项case when也可以计算出百分比,但是我的问题是和选项是动态从别的表读出来的…所以想找个能直接分组计算的方法…
SQL基础不扎实,希望大家能帮忙…
谢谢
[最优解释]
技术有限,搞的很复杂,期待高手
CREATE TABLE TBA
(
id int,
market nvarchar(50),
name1 nvarchar(50),
content1 nvarchar(50),
option1 nvarchar(50),
total int
)
drop table TBA
INSERT INTO TBA
select '101','区内市场','黑龙江','加油站排队情况','经常排队',42 union
select '101','区内市场','黑龙江','加油站排队情况','分时段排队',21 union
select '101','区内市场','黑龙江','加油站排队情况','无排队',353 union
select '101','区内市场','黑龙江','是否限量销售','汽柴油均限量',46 union
select '101','区内市场','黑龙江','是否限量销售','只有汽油限量',9 union
select '101','区内市场','黑龙江','是否限量销售','只有柴油限量',455 union
select '101','区内市场','黑龙江','是否限量销售','无限量销售',6 union
select '101','区内市场','黑龙江','断档情况','只有汽油出现断档',13 union
select '101','区内市场','黑龙江','断档情况','只有柴油出现断档',17 union
select '101','区内市场','黑龙江','断档情况','无断档',455 union
select '101','区内市场','黑龙江','断档情况','汽柴油均出现断档',31 union
select '101','区内市场','黑龙江','脱销情况','汽柴油均出现脱销',NULL union
select '101','区内市场','黑龙江','脱销情况','只有汽油出现脱销',2 union
select '101','区内市场','黑龙江','脱销情况','只有柴油出现脱销',513 union
select '101','区内市场','黑龙江','脱销情况','无脱销',1 union
select '101','区内市场','黑龙江','加油站是否停业检修','否',24 union
select '101','区内市场','黑龙江','加油站是否停业检修','是',35
select A.*,convert(nvarchar(8),convert(numeric(18,2),convert(numeric(18,2),isnull(A.total,0))/convert(numeric(18,2),B.NUM) )* 100)
+ '%' 百分比 from TBA A,
(select SUM(total) as NUM,content1 from TBA group by content1) B
where A.content1=B.content1
101区内市场黑龙江加油站是否停业检修否2441.00%
101区内市场黑龙江加油站是否停业检修是3559.00%
101区内市场黑龙江加油站排队情况分时段排队215.00%
101区内市场黑龙江加油站排队情况经常排队4210.00%
101区内市场黑龙江加油站排队情况无排队35385.00%
101区内市场黑龙江断档情况汽柴油均出现断档316.00%
101区内市场黑龙江断档情况无断档45588.00%
101区内市场黑龙江断档情况只有柴油出现断档173.00%
101区内市场黑龙江断档情况只有汽油出现断档133.00%
101区内市场黑龙江是否限量销售汽柴油均限量469.00%
101区内市场黑龙江是否限量销售无限量销售61.00%
101区内市场黑龙江是否限量销售只有柴油限量45588.00%
101区内市场黑龙江是否限量销售只有汽油限量92.00%
101区内市场黑龙江脱销情况汽柴油均出现脱销NULL0.00%
101区内市场黑龙江脱销情况无脱销10.00%
101区内市场黑龙江脱销情况只有柴油出现脱销51399.00%
101区内市场黑龙江脱销情况只有汽油出现脱销20.00%
------其他解决方案--------------------
感觉这个得分两步,
先统计一下总的,再以这张为临时,统计出百分比,
剩下的应该码字了,没动力就不动手了哈.
[其他解释]
if OBJECT_ID('TB') is not null drop table TB
CREATE TABLE TB
(
id int,market nvarchar(50),
name1 nvarchar(50),
content1 nvarchar(50),
option1 nvarchar(50),
total int
)
INSERT INTO TB
select '101','区内市场','黑龙江','加油站排队情况','经常排队',42 union
select '101','区内市场','黑龙江','加油站排队情况','分时段排队',21 union
select '101','区内市场','黑龙江','加油站排队情况','无排队',353 union
select '101','区内市场','黑龙江','是否限量销售','汽柴油均限量',46 union
select '101','区内市场','黑龙江','是否限量销售','只有汽油限量',9 union
select '101','区内市场','黑龙江','是否限量销售','只有柴油限量',455 union
select '101','区内市场','黑龙江','是否限量销售','无限量销售',6 union
select '101','区内市场','黑龙江','断档情况','只有汽油出现断档',13 union
select '101','区内市场','黑龙江','断档情况','只有柴油出现断档',17 union
select '101','区内市场','黑龙江','断档情况','无断档',455 union
select '101','区内市场','黑龙江','断档情况','汽柴油均出现断档',31 union
select '101','区内市场','黑龙江','脱销情况','汽柴油均出现脱销',NULL union
select '101','区内市场','黑龙江','脱销情况','只有汽油出现脱销',2 union
select '101','区内市场','黑龙江','脱销情况','只有柴油出现脱销',513 union
select '101','区内市场','黑龙江','脱销情况','无脱销',1 union
select '101','区内市场','黑龙江','加油站是否停业检修','否',24 union
select '101','区内市场','黑龙江','加油站是否停业检修','是',35
select t.*,convert(varchar(10),convert(numeric(10,2),convert(numeric(10,2),isnull(t.total,0))/CONVERT (numeric(10,2),a.total))*100)+'%' 百分比
from TB as t,(select SUM(total) as total,content1 from TB group by content1) as a
[其他解释]
CREATE TABLE TBA
(
id int,
market nvarchar(50),
name1 nvarchar(50),
content1 nvarchar(50),
option1 nvarchar(50),
total int
)
--drop table TBA
--上面那句启不让后面都出错
[其他解释]
测试的时候写的 忘了去掉了,