关于repeater控件的行转列

千寻若叶 2013-07-08 08:24:48
如下,我数据库里面有以下一些数据

ID name data

1 张三 测试1

2 张三 测试2

3 李四 测试1

4 张三 测试2

5 李四 测试2



要求效果是这样的

张三 测试1 测试2(合并单元格)

李四 测试1 测试2



希望大家能把代码告诉我声,我想参考下。谢谢咯,因为看了晚上说的原理,但是实在是写不出来
...全文
90 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吴青峰 2013-07-08
  • 打赏
  • 举报
回复
别说我没有告诉你:记得分去给我,你要的什么行转列、列转行,都在下面,仔细琢磨。 SQL code/* 普通行列转换 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文  74 张三 数学  83 张三 物理  93 李四 语文  74 李四 数学  84 李四 物理  94 */ ------------------------------------------------------------------------- /* 想变成 姓名 语文 数学 物理 ---------- ----------- ----------- ----------- 李四 74 84 94 张三 74 83 93 */ create table tb ( Name varchar(10) , Subject varchar(10) , Result int ) insert into tb(Name , Subject , Result) values('张三' , '语文' , 74) insert into tb(Name , Subject , Result) values('张三' , '数学' , 83) insert into tb(Name , Subject , Result) values('张三' , '物理' , 93) insert into tb(Name , Subject , Result) values('李四' , '语文' , 74) insert into tb(Name , Subject , Result) values('李四' , '数学' , 84) insert into tb(Name , Subject , Result) values('李四' , '物理' , 94) go --静态SQL,指subject只有语文、数学、物理这三门课程。 select name 姓名, max(case subject when '语文' then result else 0 end) 语文, max(case subject when '数学' then result else 0 end) 数学, max(case subject when '物理' then result else 0 end) 物理 from tb group by name /* 姓名 语文 数学 物理 ---------- ----------- ----------- ----------- 李四 74 84 94 张三 74 83 93 */ --动态SQL,指subject不止语文、数学、物理这三门课程。 declare @sql varchar(8000) set @sql = 'select Name as ' + '姓名' select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']' from (select distinct Subject from tb) as a set @sql = @sql + ' from tb group by name' exec(@sql) /* 姓名 数学 物理 语文 ---------- ----------- ----------- ----------- 李四 84 94 74 张三 83 93 74 */ ------------------------------------------------------------------- /*加个平均分,总分 姓名 语文 数学 物理 平均分 总分 ---------- ----------- ----------- ----------- -------------------- ----------- 李四 74 84 94 84.00 252 张三 74 83 93 83.33 250 */ --静态SQL,指subject只有语文、数学、物理这三门课程。 select name 姓名, max(case subject when '语文' then result else 0 end) 语文, max(case subject when '数学' then result else 0 end) 数学, max(case subject when '物理' then result else 0 end) 物理, cast(avg(result*1.0) as decimal(18,2)) 平均分, sum(result) 总分 from tb group by name /* 姓名 语文 数学 物理 平均分 总分 ---------- ----------- ----------- ----------- -------------------- ----------- 李四 74 84 94 84.00 252 张三 74 83 93 83.33 250 */ --动态SQL,指subject不止语文、数学、物理这三门课程。 declare @sql1 varchar(8000) set @sql1 = 'select Name as ' + '姓名' select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']' from (select distinct Subject from tb) as a set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name' exec(@sql1) /* 姓名 数学 物理 语文 平均分 总分 ---------- ----------- ----------- ----------- -------------------- ----------- 李四 84 94 74 84.00 252 张三 83 93 74 83.33 250 */ drop table tb --------------------------------------------------------- --------------------------------------------------------- /* 如果上述两表互相换一下:即 姓名 语文 数学 物理 张三 74  83  93 李四 74  84  94 想变成 Name Subject Result ---------- ------- ----------- 李四 语文 74 李四 数学 84 李四 物理 94 张三 语文 74 张三 数学 83 张三 物理 93 */ create table tb1 ( 姓名 varchar(10) , 语文 int , 数学 int , 物理 int ) insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93) insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94) select * from ( select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 union all select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1 union all select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1 ) t order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end -------------------------------------------------------------------- /*加个平均分,总分 Name Subject Result ---------- ------- -------------------- 李四 语文 74.00 李四 数学 84.00 李四 物理 94.00 李四 平均分 84.00 李四 总分 252.00 张三 语文 74.00 张三 数学 83.00 张三 物理 93.00 张三 平均分 83.33 张三 总分 250.00 */ select * from ( select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 union all select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1 union all select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1 union all select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1 union all select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1 ) t order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end drop table tb1
喂大的程序员 2013-07-08
  • 打赏
  • 举报
回复
引用 5 楼 zhengceHH 的回复:
非数据处理实现: 效果图: 前台代码
<table border="1">
            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
                <ItemTemplate>
                    <tr>
                        <td>
                            <%#Eval("name") %>
                            <asp:HiddenField ID="hf1" Value='<%#Eval("name") %>' runat="server" />
                        </td>
                        <asp:Repeater ID="Repeater2" runat="server">
                            <ItemTemplate>
                                <td>
                                    <%#Eval("data") %>
                                </td>
                            </ItemTemplate>
                        </asp:Repeater>
                    </tr>
                </ItemTemplate>
            </asp:Repeater>
        </table>
后台代码:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Repeater1.DataSource = TM.DBUtility.DbHelperSQL.GetDataSet("select name from View_1 group by name");
                Repeater1.DataBind();
            }
        }

        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            HiddenField hf = (HiddenField)e.Item.FindControl("hf1");
            Repeater rpt2 = (Repeater)e.Item.FindControl("Repeater2");
            rpt2.DataSource = TM.DBUtility.DbHelperSQL.GetDataSet(string.Format("select * from View_1 where name='{0}'", hf.Value));
            rpt2.DataBind();
        }
View_1 视图代码
SELECT     name, data
FROM         dbo.Table_5
GROUP BY name, data
喂大的程序员 2013-07-08
  • 打赏
  • 举报
回复
非数据处理实现:
效果图:

前台代码
<table border="1">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<tr>
<td>
<%#Eval("name") %>
<asp:HiddenField ID="hf1" Value='<%#Eval("name") %>' runat="server" />
</td>
<asp:Repeater ID="Repeater2" runat="server">
<ItemTemplate>
<td>
<%#Eval("data") %>
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>

后台代码:
        protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Repeater1.DataSource = TM.DBUtility.DbHelperSQL.GetDataSet("select name from View_1 group by name");
Repeater1.DataBind();
}
}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
HiddenField hf = (HiddenField)e.Item.FindControl("hf1");
Repeater rpt2 = (Repeater)e.Item.FindControl("Repeater2");
rpt2.DataSource = TM.DBUtility.DbHelperSQL.GetDataSet(string.Format("select * from View_1 where name='{0}'", hf.Value));
rpt2.DataBind();
}
H_Gragon 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 Return_false 的回复:
不知道如下是否符合你的需求 详细链接http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
同意!
  • 打赏
  • 举报
回复
不知道如下是否符合你的需求


详细链接http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
ly447582838 2013-07-08
  • 打赏
  • 举报
回复
嗯。。= =想问下应该具体代码怎么写呢 因为我昨天写了一天了,始终写不出来这种效果
tan598121925 2013-07-08
  • 打赏
  • 举报
回复
去掉重复的name,根据名字再查data
4.1 使用件显示文本 实例 显示密码格式文本 实例 显示长日期格式时间 实例 显示金额格式文本 4.2 使用件显示图片 实例 显示验证码图片 实例 动态显示用户头像 实例 使用网页对话框显示图片 实例 实现上传图片 实例 GridView件显示商品缩略图 4.3 件的超级链接 实例 ImageButton按钮超级链接查看商品详细信息 实例 GridView件中使用超级链接模板查看详细信息 实例 DataList件模板中使用LinkButton查看详细信息 4.4 下拉表框的应用 实例 间接改变DropDownList当前选项 实例 实现多个DropDownList件的联动 实例 动态添加、删除DropDownList件选项 4.5 单选按钮的应用 实例 性别选择 实例 网络考试系统中单选题答案的选择 4.6 复选框的应用 实例 登录身份选择 实例 网络考试系统中多选题答案的选择 4.7 件连接数据源 实例 通过向导配置AccessDataSource 实例 通过向导配置SqlDataSource 实例 通过向导配置XmlDataSource 4.8 GridView件的应用 实例 数据绑定并实现分页功能 实例 选中、编辑、取消、删除数据项 实例 GridView实现正反双项排序功能 实例 GridView件中DropDownList件的绑定 实例 通过CheckBox删除选中记录 实例 删除GridView信息弹出确认提示框 实例 在GridView件中实现自动编号 实例 GridView件实现主细表 实例 查看当前页详细信息 实例 单元格中指定字符串固定长度 实例 供求信息网审核发布信息 实例 根据学生成绩合格与不合格显示不同颜色 4.9 DataList件的使用 实例 绑定数据并实现分页 实例 编辑DataList件模板显示员工信息 实例 DataList件实现主细表 实例 DataList件实现删除功能 4.9 Repeater件的使用 实例 Repeater件数据绑定 实例 Repeater件分页 实例 编辑Repeater件标识商品信息

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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