首页 新闻 赞助 找找看

sql分组合计的问题

0
悬赏园豆:30 [已解决问题] 解决于 2015-05-03 11:15
SELECT 
isnull(所处区域+'高校','合计') AS 学校分布,
cast(AVG([总占地面积(平方米)]) AS decimal(18,2)) AS 平均值, 
MAX([总占地面积(平方米)]) AS 最大值,
MIN([总占地面积(平方米)]) AS 最小值,
COUNT(所处区域) AS 统计样本总数,
sum(case when [总占地面积(平方米)]=0 then 1 else 0 end) AS 最小值为0的样本数
FROM [tbl_2-1] GROUP BY 所处区域 WITH CUBE
ORDER BY MAX(所处区域)

 

 

得到结果

 

前面三列(平均值、最大值、最小值)的合计错了。请问要如何实现呢?

sql
dream4u的主页 dream4u | 初学一级 | 园豆:127
提问于:2015-04-30 00:10
< >
分享
最佳答案
0

你把 cast 和 avg 的位置换一下试试,如下:

AVG(cast([总占地面积(平方米)] AS decimal(18,2))) AS 平均值

收获园豆:30
Yu | 专家六级 |园豆:12980 | 2015-04-30 08:42

出来这个结果,还是不正确的。貌似不能对聚合函数直接合计

dream4u | 园豆:127 (初学一级) | 2015-04-30 08:48

@dream4u: 你这的合计是说 1+2+3 = 4?

Yu | 园豆:12980 (专家六级) | 2015-04-30 09:10

@Yu: 是的

dream4u | 园豆:127 (初学一级) | 2015-04-30 09:24

@dream4u: 逻辑有问题了,这里4也是个平均值,而不是1+2+3

Yu | 园豆:12980 (专家六级) | 2015-04-30 10:50

@dream4u:

FYI

 

  with c as (
  SELECT 
cast(isnull(ProductID,-1) as varchar(50)) AS 学校分布,
avg([UnitPrice]) AS 平均值, 
MAX([UnitPrice]) AS 最大值,
MIN([UnitPrice]) AS 最小值,
COUNT(isnull(ProductID,0)) AS 统计样本总数,
sum(case when [UnitPrice]=0 then 1 else 0 end) AS 最小值为0的样本数
FROM [Northwind].[dbo].[Order Details] GROUP BY ProductID)
select * from c  UNION
select 'total',SUM(平均值),SUM(最大值),SUM(最小值),SUM(统计样本总数),SUM(最小值为0的样本数)from c order by 学校分布
Yu | 园豆:12980 (专家六级) | 2015-04-30 11:01

@Yu: 这个办法好!可行!

dream4u | 园豆:127 (初学一级) | 2015-05-03 11:15
其他回答(1)
0

1、不要求一句SQL解决的话,可以存在临时表中,再合计。

2、通常SQL只负责前三行,后面合计一行由UI负责。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-04-30 10:09

嗯感谢指教,我现在是这样写的

SELECT
所处区域+'高校' AS 学校分布,
cast(AVG([总占地面积(平方米)]) AS decimal(18,2)) AS 平均值,
MAX([总占地面积(平方米)]) AS 最大值,
MIN([总占地面积(平方米)]) AS 最小值,
COUNT(所处区域) AS 统计样本总数,
sum(case when [总占地面积(平方米)]=0 then 1 else 0 end) AS 最小值为0的样本数
INTO #T1
FROM [tbl_2_1] GROUP BY 所处区域

SELECT
isnull(学校分布,'合计') AS 学校分布,SUM(平均值) AS 平均值,SUM(最大值) AS 最大值,SUM(最小值) AS 最小值,SUM(最小值为0的样本数) AS 最小值为0的样本数
FROM #T1 GROUP BY 学校分布 WITH ROLLUP
order by CHARINDEX(学校分布,'东部高校,中部高校,西部高校,合计')

DROP TABLE #T1

 

出来的结果,合计的数目对了,但是需要把合计行放到最后去,我指定了排序,但是没有起作用

 

支持(0) 反对(0) dream4u | 园豆:127 (初学一级) | 2015-04-30 10:37

@dream4u: 排序问题就好解决了,多弄一列OrderColumn,先对前三行排序后给OrderColumn赋值,再给一个最大的排序号给合计行的OrderColumn就行了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-04-30 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册