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(所处区域)
得到结果
前面三列(平均值、最大值、最小值)的合计错了。请问要如何实现呢?
你把 cast 和 avg 的位置换一下试试,如下:
AVG(cast([总占地面积(平方米)] AS decimal(18,2))) AS 平均值
出来这个结果,还是不正确的。貌似不能对聚合函数直接合计
@dream4u: 你这的合计是说 1+2+3 = 4?
@Yu: 是的
@dream4u: 逻辑有问题了,这里4也是个平均值,而不是1+2+3
@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: 这个办法好!可行!
1、不要求一句SQL解决的话,可以存在临时表中,再合计。
2、通常SQL只负责前三行,后面合计一行由UI负责。
嗯感谢指教,我现在是这样写的
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
出来的结果,合计的数目对了,但是需要把合计行放到最后去,我指定了排序,但是没有起作用
@dream4u: 排序问题就好解决了,多弄一列OrderColumn,先对前三行排序后给OrderColumn赋值,再给一个最大的排序号给合计行的OrderColumn就行了。