分组统计占比

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%

要求统计占比
...全文
247 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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%
*/

22,301

社区成员

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

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