很有挑战性的一个问题,高手请进,望多指教!!!

LinYeCunFu 2003-03-21 04:20:54
数据库中现有两个表:表一、表二和表三,现在希望能有一种方法生成如表四一样的页面,用来体现表三中与表一和表二均有关联的数据,请问该如何做?

表一: 表二:
_________________ _________________
| 编号 | 名称 | | 编号 | 费用 |
| 1 | 名称一 | | 1 | 费用一 |
| 2 | 名称二 | | 2 | 费用二 |
| 3 | 名称三 | | 3 | 费用三 |
…… …… …… ……
|______|________| |______|________|


表三:
___________________________________
| 编号 | 名称 | 费用 | 数值 |
| 1 | 名称一 | 费用一 | 12 |
| 2 | 名称二 | 费用二 | 78 |
| 3 | 名称三 | 费用三 | 48 |
| 3 | 名称一 | 费用二 | 45 |
…… …… …… ……
|______|________|________|________|


表四:
____________________________________
| | 费用一 | 费用二 | 费用三 |
|名称一| 12 | 45 | 86 |
|名称二| 25 | 78 | 45 |
|名称三| 33 | 65 | 48 |
…… …… …… ……
|______|________|________|_________|


...全文
26 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinYeCunFu 2003-03-24
  • 打赏
  • 举报
回复
呵呵,结帐了,这次在jsljy(小卢)的帮助下(通过MSN)把问题解决的,
这其中用到了pmtasp() 的思想,

下面是他提供的部分代码:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace test
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlGenericControl tablemore;
protected System.Web.UI.WebControls.TextBox TextBox1;

private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack )
{
string table="";
table+="<table align=\"center\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" width=\"778\" height=\"27\" align=\"center\" ><tr><td>名称</td>";
DataView dvFeiYong = new bizlogic.dbtest().select_feiyong();
for (int strFY=0;strFY<dvFeiYong.Count;strFY++)
{
table+="<td>"+dvFeiYong[strFY]["feiyong"]+"</td>";
}
table+="</tr>";


DataView dv=new bizlogic.dbtest().select_name();
for(int i=0;i<dv.Count;i++)
{
table+="<tr><td>"+dv[i]["name"]+"</td>";
DataView dv3= new bizlogic.dbtest().select_feiyong();
for(int n=0;n<dv3.Count;n++)
{
DataView dv2=new bizlogic.dbtest().select_cost(""+dv[i]["name"]+"",""+dv3[n]["feiyong"]+"");
if (dv2.Count==0)
{table+="<td>0</td>";}
else{table+="<td>"+dv2[0]["cost"]+"</td>";}
}
table+="</tr>"; //ViewState["citylist"]+="<a href=\""+dv[i]["siteurl"]+"\" target=\"_top\">"+dv[i]["district"]+"</a> ";
}
table+="</table>";
tablemore.InnerHtml=table;
}
// 在此处放置用户代码以初始化页面
}
public string gettext()
{if (TextBox1.Text!="")
return TextBox1.Text;
else
return "0";
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}
jsljy 2003-03-24
  • 打赏
  • 举报
回复
我的内容我就不贴了,不好贴,不好意思
binapex 2003-03-22
  • 打赏
  • 举报
回复
另外,我这样做还可以不要第三个表了
binapex 2003-03-22
  • 打赏
  • 举报
回复
我也遇到了这种情况,一个学生表,一个是科目表,一个是成绩表,还一个就是你的第四个显示情况的表,我把它作为一个表了。我是这样处理的,我的第四个表是动态生成的,可以是临时表也可以是动态更新的。我采用动态更新。因为有些数据需要查询。如果需要交流的话,QQ10212988
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
为方便与大家的交流,希望你们能把联系方式留下,

或是加我的 MSN:haling_2002@msn.com QQ:21471947

谢谢!
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
TO:ipconfiger(小李不冲动),请问你在页面中是用DataGrid绑定的吗?还是用Table?
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
呵呵~~ 一下子冒出了这么多代码,得要仔细看看了。 :)

谢谢 zzhuz(大件)和ipconfiger(小李不冲动) 先!
ipconfiger 2003-03-21
  • 打赏
  • 举报
回复
省略所有html代码,如下代码
SqlCommand cmd = new SqlCommand( "select 名称 from 表一",new SqlConnection("连接字符串") );
cmd.Connection.Open();
SqlDataReader readerN = cmd.ExecuteReader();
string name = string.Empty;
string feiy=string.empty
string shuz=string.empty
while( readerN.Read() )
{
name = reader.GetString( "名称" );
SqlCommand cmd2 = new SqlCommand( "select 费用 from 表二",new SqlConnection ("连接字符串") );
cmd2.Connection.Open();
SqlDataReader readerF = cmd2.ExecuteReader();
while( readerF.Read() )
{
feiy=readerF.GetString("费用")
SqlCommand cmd3 = new SqlCommand( "select 数值 from 表三 where 费用='"+name+"' and 费用='"+feiy+"' ",new SqlConnection ("连接字符串") );
cmd3.Connection.Open();
SqlDataReader readerR = cmd3.ExecuteReader();
while(readerR.read())
{
readerR.GetString("数值")
}
}
}
很简单的三重循环,也可以说是二重,因为第三个循环也可以不要,他只循环一次,加上html的代码就可以生成表格了,这里为了看得明白用了笨办法,其实应该写一个数据库类,用一个方法传递sql语句过去直接返回datareader对象的,这样子代码看起来就比较爽了,原来asp写过这样子的,改了一下就可以了
大健 2003-03-21
  • 打赏
  • 举报
回复
好像很麻烦。。。都是用 pmtasp() 的方法算了~~
大健 2003-03-21
  • 打赏
  • 举报
回复
回复人: Haiwer(海阔天空) ( ) 信誉:100 2002-1-30 14:13:42 得分:6



斑竹,干脆把如下格式的也写了:

Table1:
id var1 var2 var3 ..... (这里的1,2,3.....是ID的值)
name1 aa ii xx ……
name2 bb jj yy ……
name3 cc kk zz ……
……………….








Top

回复人: zhuzhichao(竹之草) ( ) 信誉:100 2002-1-30 14:50:16 得分:0



to Haiwer(海阔天空):

好,马上就写.





Top

回复人: zhuzhichao(竹之草) ( ) 信誉:100 2002-1-30 15:13:39 得分:0



按照Haiwer(海阔天空)的格式也寫好了.


declare @vVariable varchar(2000),@var varchar(2000) --中間值的變量
declare @sql nvarchar(4000) -- 動態sql
declare @insertSql varchar(4000) -- 插入臨時表的sql
declare @alterSql varchar(100) -- 修改臨時表#temp1的sql
declare @updateSql varchar(200) -- 更新臨時表#temp1的數據sql
declare @i int,@count int -- Table2的紀錄數
select @count = count(1) from Table2;
if @count = 0
begin
print 'No row'
return
end
if @count > 254
begin
print 'Too many rows'
return
end
set @vVariable = ' '
select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
object_id('Table2') and name <> 'id' order by colid
set @vVariable = right(@vVariable,len(@vVariable) - 6)

if object_id('tempdb.dbo.#temp1') is not null
drop table #temp1
select identity(int) id,name into #temp1 from syscolumns where id = object_id('Table2') and name <> 'id' order by colid

set @i = 1
while (@i <= @count)
begin
if object_id('tempdb.dbo.#temp2') is null -- 創建臨時表#temp2
create table #temp2
(
id int identity,
variable varchar(10)
)
else
truncate table #temp2

set @sql = 'select @var = '+@vVariable+' from Table2 where id = ' + convert(varchar(3),@i)
exec sp_executesql @sql,N'@var varchar(2000) output',@var output -- 組成以逗號分格的變量@var

set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
insert into #temp2 values(''')+''')'
exec (@insertSql) -- 根據變量中的逗號分格插入臨時表

set @alterSql = 'alter table #temp1 add var' + convert(varchar(3),@i) + ' varchar(10)'
exec (@alterSql) -- 增加臨時表的字段

set @updateSql = 'update #temp1 set var' + convert(varchar(3),@i) + ' = variable from #temp2 '
+'where #temp1.id = #temp2.id'
exec (@updateSql) -- 更新臨時表的數據

set @i = @i + 1
end
alter table #temp1 drop column id
select * from #temp1
大健 2003-03-21
  • 打赏
  • 举报
回复
你要的应该是行列互换吧~~看看这个:
(因为找不到地址,所以粘贴出来)

主  题: MSSQL中,有位网友email问我的问题,下面是我给出的方案,大家也来看一看吧.(zhuzhichao)
作  者: zhuzhichao (竹之草)
等  级:
信 誉 值: 100
所属论坛: MS-SQL Server 基础类
问题点数: 300
回复次数: 60
发表时间: 2002-1-30 10:03:24




问题描述:
有表Table2,其结构及内容如下:
Table2:

id name1 name2 name3 ……(列有很多)
1 aa bb cc ……
2 ii jj kk ……
3 xx yy zz ……
…………………………………………

有表Table1,其结构如下:
Table1:
id variable

现在想把Table2中的除id以外的字段名(注意,是字段名)填入Table1中的id,
从Table2中提取某一行(先假设是id为1的那一行吧)中与每个字段名对应的内容填入Table1的variable.

以id为1的那行为例,就是要达到如下的效果:
Table1:
id variable
name1 aa
name2 bb
name3 cc
……………….


我的解决方案:

declare @vVariable varchar(2000),@var varchar(2000) --中間值的變量
declare @sql nvarchar(4000) -- 動態sql
declare @insertSql varchar(4000) -- 插入臨時表的sql
set @vVariable = ' '
if object_id('tempdb.dbo.#temp1') is not null
drop table #temp1
select identity(int) id,name into #temp1 from syscolumns where id = object_id('Table2') and name <> 'id' order by colid

if object_id('tempdb.dbo.#temp2') is null -- 創建臨時表#temp2
create table #temp2
(
id int identity,
variable varchar(10)
)
else
truncate table #temp2

select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
object_id('Table2') and name <> 'id' order by colid
set @vVariable = right(@vVariable,len(@vVariable) - 6)
set @sql = 'select @var = '+@vVariable+' from Table2 where id = 1'
exec sp_executesql @sql,N'@var varchar(2000) output',@var output -- 組成以逗號分格的變量@var

set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
insert into #temp2 values(''')+''')'
exec (@insertSql) -- 根據變量中的逗號分格插入臨時表

insert into Table1(id,variable)
select name,variable from #temp1,#temp2
where #temp1.id = #temp2.id

select * from Table1
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
谢谢zzhuz(大件)的光临,呵呵~~

表一和表二并不是多余的,因为名称和费用都是可以维护的,所以这两个表是必需的。
表四是动态生成的的一个页面,所以还是有些难度的。

继续肯请高手出手!

大健 2003-03-21
  • 打赏
  • 举报
回复
多了括号了,改正:
SELECT a.名称,
(SELECT b.数值 FROM 表3 b WHERE b.名称=a.名称 AND b.费用='费用一')
AS 费用一,
(SELECT c.数值 FROM 表3 c WHERE c.名称=a.名称 AND c.费用='费用二')
AS 费用二,
(SELECT d.数值 FROM 表3 d WHERE d.名称=a.名称 AND d.费用='费用三')
AS 费用三
FROM 表3 a
大健 2003-03-21
  • 打赏
  • 举报
回复
表1跟表2好像多余,难道是我理解错?
只有三种费用吗?如果是的话得到表4结构的SQL语句:
SELECT a.名称,
(SELECT b.数值 FROM 表3 b WHERE b.名称=a.名称 AND b.费用='费用一')
)AS 费用一,
(SELECT c.数值 FROM 表3 c WHERE c.名称=a.名称 AND c.费用='费用二')
)AS 费用二,
(SELECT d.数值 FROM 表3 d WHERE d.名称=a.名称 AND d.费用='费用三')
)AS 费用三
FROM 表3 a
pmtasp 2003-03-21
  • 打赏
  • 举报
回复
返回返回的结果,然后输出0或你想要的字符
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
pmtasp() ,谢谢你的回答,你的方法我呆会儿会去试一试。

但同时有一个疑问:因为在表三中,对于一个名称来说(比如名称一),并不是所有的费用项目它都会有值(比如“名称一”没有“费用三”这个值),这个时候,如何来确定表三中的数值记录准确无误地显示在单元格中呢?
pmtasp 2003-03-21
  • 打赏
  • 举报
回复
剩下的事,就是对齐表格了
nidazhi 2003-03-21
  • 打赏
  • 举报
回复
用交叉表吧,不过有点烦
pmtasp 2003-03-21
  • 打赏
  • 举报
回复
<table>
<tr>
<td></td>
<%for(){//费用循环写出表头%>
<td></td>
<%}%>
</tr>

<%for(){//名称循环%>
<tr>
<td><%Response.Write(名称);%></td>
<%for(){//费用循环
//得到where条件名称=“” and 费用=“”,取得数值
%>
<td><%Response.Write(数值);%></td>
<%}%>
</tr>
<%}%>
</table>
LinYeCunFu 2003-03-21
  • 打赏
  • 举报
回复
表四其实不是个表,是页面需要这样去体现表三中的内容,

希望有高手能解答!
加载更多回复(3)

62,041

社区成员

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

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

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

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