大神出马吧,如何生成这样不规整的表格

Adam_09 2014-10-26 12:22:51
在SQL SERVER中表的格式是这样的

表的意思是某一个省份的某性别、年龄、身高、体重的人的平均锻炼次数和时长
现在我想统计的是把相同 性别 年龄 身高 体重 但不同省份的放在一起(相当于同一性别、年龄、身高、体重的各省份之间的对比)
随后我想要的是这样的EXCEL表

不行至少得这样



我从数据库中提取表到datatable,但是接下来怎么办就不知道了,特别是合并单元格的问题
所以请大神出马
...全文
448 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcqm8888 2014-11-16
  • 打赏
  • 举报
回复
不参加EXCEL培训班,看来是一时半会儿难掌握的,哪里有培训班呢?
auos 2014-11-16
  • 打赏
  • 举报
回复
额,我做的都是读出数据然后自己写到表格中,我用的sourcegrid,效果还不错。
smthgdin_020 2014-10-28
  • 打赏
  • 举报
回复
当然,你也可以再后台自己去定义excel表格,可以自己控制列的合并居中什么的,有了这个模板,就可以往里面添数据,最后再response输出。
专注or全面 2014-10-28
  • 打赏
  • 举报
回复
数据库中可以用sql直接实现,sqlserver或者oracle中都有相关的函数,mysql中不懂 给你我的笔记参考
create table MeterialInfo
(
	id int identity(1,1),
	MeterialName varchar(50),
	InStoreDate datetime,
	Weight decimal(18,3),
	Remark varchar(200)
)

select 100*RAND()

insert into MeterialInfo values ('AAAAA',GETDATE(),100*RAND(),NEWID())
waitfor delay '00:00:01:01'
insert into MeterialInfo values ('BBBBB',GETDATE(),100*RAND(),NEWID())
waitfor delay '00:00:01:01'
insert into MeterialInfo values ('AAAAA',GETDATE(),100*RAND(),NEWID())
waitfor delay '00:00:01:01'
insert into MeterialInfo values ('BBBBB',GETDATE(),100*RAND(),NEWID())

select 
CASE WHEN GROUPING(MeterialName) = 1 
THEN 'ALL' ELSE MeterialName END 
AS MeterialName,
SUM(Weight) from MeterialInfo
group by MeterialName  WITH CUBE 



--MeterialName	(无列名)
--AAAAA	        217.411
--BBBBB	        274.565
--ALL	              491.976




select 
CASE WHEN GROUPING(MeterialName) = 1 
THEN 'ALL' ELSE MeterialName END 
AS MeterialName,InStoreDate,
SUM(Weight) from MeterialInfo
group by MeterialName ,InStoreDate  WITH ROLLUP

MeterialName	InStoreDate	(无列名)
AAAAA	2012-12-12 11:16:43.957	76.909
AAAAA	2012-12-12 11:16:45.957	60.072
AAAAA	2012-12-12 11:16:47.707	53.246
AAAAA	2012-12-12 11:16:49.707	27.184
AAAAA	2012-12-12 11:32:53.433	89.429
AAAAA	2012-12-12 11:32:53.620	21.208
AAAAA	2012-12-12 11:32:53.637	90.963
AAAAA	NULL	                  419.011
BBBBB	2012-12-12 11:16:44.957	68.751
BBBBB	2012-12-12 11:16:46.957	33.855
BBBBB	2012-12-12 11:16:48.707	77.566
BBBBB	2012-12-12 11:16:50.720	94.393
BBBBB	2012-12-12 11:32:53.433	96.330
BBBBB	2012-12-12 11:32:53.620	72.308
BBBBB	2012-12-12 11:32:53.637	43.261
BBBBB	NULL	                  486.464
ALL	NULL	                  905.475
allen0118 2014-10-28
  • 打赏
  • 举报
回复

使用rdlc,用分组把数据分好,然后直接导出Excel就有这种格式,如下图:
Adam_09 2014-10-27
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
select的时候,order by 性别,年龄,身高,体重,相同的就都挨着了 然后循环一下处理就行了 话说,你求总的锻炼次数和时长,这没什么意义
具体怎么循环处理呢。。。。。。
Adam_09 2014-10-27
  • 打赏
  • 举报
回复
[quote=引用 5 楼 Z65443344 的回复:] 学过什么叫"加权平均数"吗? 人家本来就是个平均数,而不是3个个人 你把平均数这样直接相加,根本是完全无意义的行为 好比江苏平均锻炼1次,每次1小时,统计了30000个人得出的结论 而云南平均锻炼2次,1小时,只统计了3个人 你把30000个人的平均值跟3个人的平均值相加,最后是要除以2吗??[/quote 大神,原表不是这个,我只是那这个做个案例,方法是一样的 见笑了。。。。
smthgdin_020 2014-10-27
  • 打赏
  • 举报
回复
一个老的思路: 1.先用excel设置布局,布局里需要赋值的地方记得弄成标签比如说{0},{2}; 2.将上一步的另存为html; 3.后台代码获取值之后,替换掉标签内容。
jun471537173 2014-10-27
  • 打赏
  • 举报
回复
百度一下“DataGridView合并单元格” 或者用报表也可以实现,设置下合并相同内容单元格就可以了
於黾 2014-10-27
  • 打赏
  • 举报
回复
学过什么叫"加权平均数"吗? 人家本来就是个平均数,而不是3个个人 你把平均数这样直接相加,根本是完全无意义的行为 好比江苏平均锻炼1次,每次1小时,统计了30000个人得出的结论 而云南平均锻炼2次,1小时,只统计了3个人 你把30000个人的平均值跟3个人的平均值相加,最后是要除以2吗??
於黾 2014-10-27
  • 打赏
  • 举报
回复
select的时候,order by 性别,年龄,身高,体重,相同的就都挨着了 然后循环一下处理就行了 话说,你求总的锻炼次数和时长,这没什么意义
truediego 2014-10-27
  • 打赏
  • 举报
回复
第一种效果: 看你输出Excel用的是什么方法或者插件,然后合并单元格就行了 第二种效果: 检索的sql用 group by rollup,就可以有小计行了
pinqing 2014-10-27
  • 打赏
  • 举报
回复
npoi 这个组件生成Excel很强,里面应该有合并单元格的方法
於黾 2014-10-27
  • 打赏
  • 举报
回复
引用 8 楼 Adam_09 的回复:
[quote=引用 4 楼 Z65443344 的回复:] select的时候,order by 性别,年龄,身高,体重,相同的就都挨着了 然后循环一下处理就行了 话说,你求总的锻炼次数和时长,这没什么意义
具体怎么循环处理呢。。。。。。[/quote] 按行循环,再按列循环,双重for循环 先判断这一行和上一行是否相同,相同就做累加 不相同就将上面相同的几行合并单元格,并把累计数量清空
netwar 2014-10-26
  • 打赏
  • 举报
回复
生成表格的时候,ROWSPAN ,COLSPAN
Adam_09 2014-10-26
  • 打赏
  • 举报
回复
求不沉啊。。。。
Adam_09 2014-10-26
  • 打赏
  • 举报
回复
引用 2 楼 netwar 的回复:
生成表格的时候,ROWSPAN ,COLSPAN
能具体点么?不怎么懂

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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