分组统计占比

czyoooo 2017-02-16 09:12:21
表:
Customer SALETYPE TYPECOUNT
A 水果 20
A 水果 10
A 肉肉 50
B 肉肉 100


结果:
A 水果 (30/80)*100%
A 肉肉 (50/80)*100%
B 肉肉 (100/100)*100%

要求统计占比
...全文
239 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2017-02-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 roy_88 的回复:]过滤只显示>70%[/Quote]
从小分组([Customer],[SALETYPE]) CROSS APPLY 到大分组([Customer])不是很合适,比如'水果'、'肉肉'会分别统计一次'A'。
这和嵌套在 SELECT 字段中的子查询没区别了。
还不如大小两个分组统计子查询进行连接。
中国风 2017-02-17
  • 打赏
  • 举报
回复
过滤只显示>70% e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#1') is null
	drop table #1
Go
Create table #1([Customer] nvarchar(21),[SALETYPE] nvarchar(22),[TYPECOUNT] int)
Insert #1
select N'A',N'水果',20 union all
select N'A',N'水果',10 union all
select N'A',N'肉肉',50 union all
select N'B',N'肉肉',100
Go

SELECT
[Customer],[SALETYPE],STR([TYPECOUNT]*100.00/t2.[TYPECOUNT2],6,2)+'%' AS [TYPECOUNT]
FROM 
(
SELECT 
[Customer],[SALETYPE],SUM([TYPECOUNT]) AS [TYPECOUNT]
FROM #1
GROUP BY [Customer],[SALETYPE]
) AS t
CROSS APPLY(SELECT SUM([TYPECOUNT]) FROM #1 WHERE [Customer]=t.[Customer]) AS t2([TYPECOUNT2])
WHERE [TYPECOUNT]/t2.[TYPECOUNT2]>0.7
ORDER BY 2 desc,1 



/*
Customer	SALETYPE	TYPECOUNT
B	肉肉	100.00%*/
中国风 2017-02-17
  • 打赏
  • 举报
回复
引用 4 楼 czyoooo 的回复:
roy_88: 开窗函数不支持 WHERE
?不明用上面方法多动手测试 以上#1方法为SQL05之后版本支持
Tiger_Zhao 2017-02-17
  • 打赏
  • 举报
回复
再嵌套一层啊
    SELECT *
FROM (
-- 原#1语句不包括 ORDER BY
) AS t2
WHERE TYPECOUNT > ' 70.00%'
ORDER BY 2 DESC, 1

中国风 2017-02-17
  • 打赏
  • 举报
回复
用#1方法这样加条件,内嵌多1层,这样写比上面方法效率高,楼主可测测


SELECT [Customer] ,
[SALETYPE] ,
STR([TYPECOUNT], 6, 2) + '%' AS [TYPECOUNT]
FROM ( SELECT [Customer] ,
[SALETYPE] ,
[TYPECOUNT] * 100.00
/ SUM([TYPECOUNT]) OVER ( PARTITION BY [Customer] ) AS [TYPECOUNT]
FROM ( SELECT [Customer] ,
[SALETYPE] ,
SUM([TYPECOUNT]) AS [TYPECOUNT]
FROM #1
GROUP BY [Customer] ,
[SALETYPE]
) AS t
) AS tt
WHERE [TYPECOUNT] > 70
ORDER BY 2 DESC ,
1
中国风 2017-02-17
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
[Quote=引用 9 楼 roy_88 的回复:]过滤只显示>70%[/Quote] 从小分组([Customer],[SALETYPE]) CROSS APPLY 到大分组([Customer])不是很合适,比如'水果'、'肉肉'会分别统计一次'A'。 这和嵌套在 SELECT 字段中的子查询没区别了。 还不如大小两个分组统计子查询进行连接。
#2同#9 这样的写法在性能上是没区别的,都会走嵌套循环,写法不同而已 不加条件时,#1方法高效
czyoooo 2017-02-16
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#1') is null
	drop table #1
Go
Create table #1([Customer] nvarchar(21),[SALETYPE] nvarchar(22),[TYPECOUNT] int)
Insert #1
select N'A',N'水果',20 union all
select N'A',N'水果',10 union all
select N'A',N'肉肉',50 union all
select N'B',N'肉肉',100
Go

SELECT
[Customer],[SALETYPE],STR([TYPECOUNT]*100.00/SUM([TYPECOUNT])OVER(PARTITION BY [Customer]),6,2)+'%' AS [TYPECOUNT]
FROM 
(
SELECT 
[Customer],[SALETYPE],SUM([TYPECOUNT]) AS [TYPECOUNT]
FROM #1
GROUP BY [Customer],[SALETYPE]
) AS t
ORDER BY 2 desc,1 

/*
Customer	SALETYPE	TYPECOUNT
A	水果	 37.50%
A	肉肉	 62.50%
B	肉肉	100.00%
*/
如果要求查询比例大于 70%的呢? 结果: B 肉肉 100.00% 开窗函数不支持 WHERE
二月十六 2017-02-16
  • 打赏
  • 举报
回复
引用 3楼我是你的主体 的回复:
如果要求查询比例大于 70%的呢? 结果: B 肉肉 100.00%
添加where 条件就行了
czyoooo 2017-02-16
  • 打赏
  • 举报
回复
roy_88: 开窗函数不支持 WHERE
czyoooo 2017-02-16
  • 打赏
  • 举报
回复
如果要求查询比例大于 70%的呢? 结果: B 肉肉 100.00%
二月十六 2017-02-16
  • 打赏
  • 举报
回复
语句:
--测试数据
;with taba (Customer,SALETYPE,TYPECOUNT)as
(
select 'A','水果',20.00 union all
select 'A','水果',10.00 union ALL
select 'A','肉肉',50.00 union ALL
select 'B','水果',100.00
)
--测试数据结束
SELECT a.Customer ,
a.SALETYPE ,
ROUND(( CAST(( SUM(a.TYPECOUNT) / ( t.count + 0.0 ) * 100 ) AS DECIMAL(9,
2)) ), 2) AS [count]
FROM taba a
INNER JOIN ( SELECT b.Customer ,
SUM(b.TYPECOUNT) AS [count]
FROM taba b
GROUP BY b.Customer
) t ON a.Customer = t.Customer
GROUP BY a.Customer ,
a.SALETYPE ,
[count]



结果:

中国风 2017-02-16
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#1') is null
	drop table #1
Go
Create table #1([Customer] nvarchar(21),[SALETYPE] nvarchar(22),[TYPECOUNT] int)
Insert #1
select N'A',N'水果',20 union all
select N'A',N'水果',10 union all
select N'A',N'肉肉',50 union all
select N'B',N'肉肉',100
Go

SELECT
[Customer],[SALETYPE],STR([TYPECOUNT]*100.00/SUM([TYPECOUNT])OVER(PARTITION BY [Customer]),6,2)+'%' AS [TYPECOUNT]
FROM 
(
SELECT 
[Customer],[SALETYPE],SUM([TYPECOUNT]) AS [TYPECOUNT]
FROM #1
GROUP BY [Customer],[SALETYPE]
) AS t
ORDER BY 2 desc,1 

/*
Customer	SALETYPE	TYPECOUNT
A	水果	 37.50%
A	肉肉	 62.50%
B	肉肉	100.00%
*/
本项目主要使用了学校、省份、水平层次、办学类别、985、211、双一流、专业名称、国家特色专业等数据,通过pandas相关模块对数据进行抽取、清洗和分组统计计算,再而用pyecharts数据可视化模块绘制交互式可视化图表,分析得出各省大学数量分布、本科,专科比、各办学类别比、985,211,双一流学校分布、开设数量前二十的专业以及国家特色专业分布等数据结果,旨在结合这些数据分析中国目前高校(大学)办学状况、中国开设数量排名前20的热门专业和国家特色专业主要分布在哪些学校等关于高校办学的信息,为报志愿的高考生和想了解这方面信息的人提供参考。 本项目分析了中国高校和专业的相关数据,旨在结合这些数据分析中国目前高校(大学)办学状况、中国开设数量排名前20的热门专业和国家特色专业主要分布在哪些学校等关于高校办学的信息,为报志愿的高考生和想了解这方面信息的人提供信息和参考。 从上面的可视化结果可以看出中国目前高校(大学)的办学状况,包括高校在各个省份的分布、本科和专科比情况、各个办学类别比情况、985,211,双一流分布情况,中国开设数量排名前20的热门专业和国家特色专业学校分布等关于高校办学的信息,为报志愿的高考生和想了解这方面信息的人提供信息和参考。
第一章 前言 第二章 多源关联分片* 理解多源分片的概念与特征 体会多源分片报表的制作 理解扩展模型、主格模型 在报表中使用多个数据集,并在报表中使其数据相关 设计多源交叉报表 人为定义主格 第三章 不规则分组* 理解不规则分组的概念及各种性态特征:不完全分组、归并分组、可重分组、条件枚举、按段分组 理解不规则分组报表的实现原理 使用group函数的过滤参数实现不完全分组报表 使用enumgroup函数设计归并分组报表 使用overlap函数设计重叠分组报表 使用enumgroup函数设计条件枚举分组报表 使用plot函数设计按段分组报表 第四章 动态格间运算* 了解动态格间运算的背景 理解(绝对)层次坐标的原理和语法 理解位移坐标的原理和语法 理解格集的原理和语法 理解根坐标概念和语法 理解$、&运算符和seq函数 使用简单位移坐标制作累积报表、同期比报表 使用绝对层次坐标制作比值报表 使用格集制作比报表、分组汇总报表 使用$符号制作条件汇总报表、复杂同期比报表 综合运用层次坐标、条件表达式、格集等概念制作独立格运算报表 使用&符号和seq函数计算序号、制作序号报表 第五章 动态参数 了解动态参数的背景 理解动态参数的概念和原理 设计动态参数报表 第六章 动态宏 了解动态宏的背景 理解动态宏的概念和原理 设计动态宏报表 第七章 报表组* 了解报表组的背景与组成结构 了解报表组的各种应用 设计报表组 发布报表组到网页上 把报表组转成填报表组 第八章 高级统计图* 理解统计图配色方案 了解各种统计图的背景 理解各种高级统计图的数据源 改变统计图的配色方案 双轴柱线图 双轴折线图 时间走势图 时序状态图 干特图 仪表盘 雷达图 里程碑 工字图 全距图

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧